Return-Path: X-Original-To: apmail-tomcat-users-archive@www.apache.org Delivered-To: apmail-tomcat-users-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id A0F2117DA1 for ; Sun, 6 Sep 2015 20:33:34 +0000 (UTC) Received: (qmail 58555 invoked by uid 500); 6 Sep 2015 20:33:27 -0000 Delivered-To: apmail-tomcat-users-archive@tomcat.apache.org Received: (qmail 58493 invoked by uid 500); 6 Sep 2015 20:33:27 -0000 Mailing-List: contact users-help@tomcat.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Tomcat Users List" Delivered-To: mailing list users@tomcat.apache.org Received: (qmail 58482 invoked by uid 99); 6 Sep 2015 20:33:27 -0000 Received: from Unknown (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 06 Sep 2015 20:33:27 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 67240180425 for ; Sun, 6 Sep 2015 20:33:27 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=0 tagged_above=-999 required=6.31 tests=[none] autolearn=disabled Received: from mx1-us-west.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id E5xIMTfxtJGx for ; Sun, 6 Sep 2015 20:33:18 +0000 (UTC) Received: from mx.sh-solutions.de (mx.sh-solutions.de [188.40.191.160]) by mx1-us-west.apache.org (ASF Mail Server at mx1-us-west.apache.org) with ESMTP id 3B93F20382 for ; Sun, 6 Sep 2015 20:33:18 +0000 (UTC) Received: from exchange.sh-solutions.de ([78.47.242.210]) by mx.sh-solutions.de with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1ZYgch-0007Ry-1C; Sun, 06 Sep 2015 20:33:11 +0000 Received: from exchange.sh-solutions.de (2002:4e2f:f2d2::4e2f:f2d2) by exchange.sh-solutions.de (2002:4e2f:f2d2::4e2f:f2d2) with Microsoft SMTP Server (TLS) id 15.0.847.32; Sun, 6 Sep 2015 22:33:06 +0200 Received: from exchange.sh-solutions.de ([78.47.242.210]) by exchange.sh-solutions.de ([78.47.242.210]) with mapi id 15.00.0847.030; Sun, 6 Sep 2015 22:33:06 +0200 From: "Steffen Heil (Mailinglisten)" To: Tomcat Users List , Christopher Schultz Subject: AW: AW: WebSocket asynchronous reads Thread-Topic: AW: WebSocket asynchronous reads Thread-Index: AdDgDDTeWgrFRKbyRDakGMiHL6CG2QAAaPqAAAQ9vvAAYpaAAAHOYy1g Date: Sun, 6 Sep 2015 20:33:06 +0000 Message-ID: <9bdf2351861f496e9f0b5546a28e4d0b@exchange.sh-solutions.de> References: <9bac973a252848c484c8c1755ea6a848@exchange.sh-solutions.de> <257E1700-1D09-4496-842E-B48A419E906F@apache.org> <55E09F3A.2070009@christopherschultz.net> In-Reply-To: <55E09F3A.2070009@christopherschultz.net> Accept-Language: de-DE, en-US Content-Language: de-DE X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [93.212.94.72] Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=2.16.840.1.101.3.4.2.1; boundary="----=_NextPart_000_001F_01D0E8F4.02DEBB40" MIME-Version: 1.0 ------=_NextPart_000_001F_01D0E8F4.02DEBB40 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Hi > > Which means I have to either buffer all incoming messages until I am > > ready to process them (might occupy lots of memory) or I have to drop > > them. Both is not really ideal. > I'm largely ignorant of the asynchronous world, but I do have a question about what you're asking. Are you really asking if Tomcat can > buffer all that data for you (which might occupy lots of memory) until you are ready to accept it? It seems like if you aren't comfortable > with dropping the data on the floor, then it's your responsibility to accept the data and deal with it yourself, right? No. I am asking tomcat not to read data from the socket, if the app is not ready to receive it in the first place. The data will then stay in the os inbound buffers and fill up the receive window, so the *sender* will be blocked eventually. TCP allows the sender to know, when the receiver cannot handle more data right away, just the websocket api cannot. Regards, Steffen ------=_NextPart_000_001F_01D0E8F4.02DEBB40 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCCFJUw ggY0MIIEHKADAgECAgEgMA0GCSqGSIb3DQEBBQUAMH0xCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1T dGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5n MSkwJwYDVQQDEyBTdGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzEwMjQyMTAy NTVaFw0xNzEwMjQyMTAyNTVaMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UEAxMv U3RhcnRDb20gQ2xhc3MgMiBQcmltYXJ5IEludGVybWVkaWF0ZSBDbGllbnQgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDLKIVFnAEs+xnyq6UzjCqgDcvQVe1dIoFnRsQPCFO+y92k 8RK0Pn3MbQ2Gd+mehh9GBZ+36uUQA7Xj9AGM6wgPhEE34vKtfpAN5tJ8LcFxveDObCKrL7O5UT9W snAZHv7OYPYSR68mdmnEnJ83M4wQgKO19b+Rt8sPDAz9ptkQsntCn4GeJzg3q2SVc4QJTg/WHo7w F2ah5LMOeh8xJVSKGEmd6uPkSbj113yKMm8vmNptRPmM1+YgmVwcdOYJOjCgFtb2sOP79jji8uhW R91xx7TpM1K3hv/wrBZwffrmmEpUeuXHRs07JqCCvFh9coKF4UQZvfEg+x3/69xRCzb1AgMBAAGj ggGtMIIBqTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrlWDb+wx yrn3HfqvazHzyB3jrLswHwYDVR0jBBgwFoAUTgvvGqRAW6UXaYcwyjRoQ9BBrvIwZgYIKwYBBQUH AQEEWjBYMCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5zdGFydHNzbC5jb20vY2EwLQYIKwYBBQUH MAKGIWh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3Nmc2NhLmNydDBbBgNVHR8EVDBSMCegJaAjhiFo dHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9zZnNjYS5jcmwwJ6AloCOGIWh0dHA6Ly9jcmwuc3RhcnRz c2wuY29tL3Nmc2NhLmNybDCBgAYDVR0gBHkwdzB1BgsrBgEEAYG1NwECATBmMC4GCCsGAQUFBwIB FiJodHRwOi8vd3d3LnN0YXJ0c3NsLmNvbS9wb2xpY3kucGRmMDQGCCsGAQUFBwIBFihodHRwOi8v d3d3LnN0YXJ0c3NsLmNvbS9pbnRlcm1lZGlhdGUucGRmMA0GCSqGSIb3DQEBBQUAA4ICAQA6qScN yNO0FpHvaZTQacVMXH33O51KyEKSRw3IvdQxRu31YR0ZDGdSfgSoOVDVMSBSdmfQfdDInHPzV3LO 5DwUXZ+lxjv7z3PO2OkfnFkvTXPfn6dxJ5rJveDsTsCPcJ/Kp6/+qN5g+J6D/SaYcFD018B6L42r 0Z4VEBy36P4tjRtF14Ex10tl5tJFVKM16qWKQHbpjIgf73s49UB0CQ5lHT2DHKfq3oPfdNc5Mk93 w1v4ryVb+qVrZIej8NsrWU+5r4O2IV91edDb/OtHFddZqHFFXKgS79IHE/hwQ2LW7r3sTX7cDUCg +dfdwO8zeLxuwk2JF8crUoyrl66RGrRIhT8VoG/OJ1Y9uUlOav69V4cG8upi4ZG2l7JZFbcBFk91 Wp+Payo5SuF61CmGFrZ386umkmpObtFacXda2O/bVoQ9xHQrzoTc/0KZTWvlZCLK3Ke/vGYT9ZdW 9lOjGsSFbXrlTA919L84iMK+48WGnvRWY28ZaVHpql43AtEGhXze6iNCbEDACy+4hkQYOytAqDgc xAnQ937mYpeZFPyz/XK9QSt9VNFMuudWxZwDDDJKoQAoSG59Hou9lZ26UrK60nRdAQBmEPL8h2nu WgoPh++XVQld9yuhbsWa39Pck8/lcfz5HUVGJF5mc/zk38iV7FDlF68puiryNq2KXHEpOTCCBoww ggV0oAMCAQICAkt0MA0GCSqGSIb3DQEBBQUAMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3Rh cnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4 MDYGA1UEAxMvU3RhcnRDb20gQ2xhc3MgMiBQcmltYXJ5IEludGVybWVkaWF0ZSBDbGllbnQgQ0Ew HhcNMTQwNTA2MjIwMzI0WhcNMTYwNTA2MTIzMTUzWjCBmjEZMBcGA1UEDRMQSUY0OFlKNG5mdkRT NnVVTzELMAkGA1UEBhMCREUxETAPBgNVBAgTCFNhYXJsYW5kMRUwEwYDVQQHDAxTYWFyYnLDvGNr ZW4xFTATBgNVBAMTDFN0ZWZmZW4gSGVpbDEvMC0GCSqGSIb3DQEJARYgY3VzdG9tZXItc3VwcG9y dEBzaC1zb2x1dGlvbnMuZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQClLqCPmCzg vZiuTqkDJONWFp9D4tvaF1y5G+GKfMCkCo6LV9mmqn3sNLOqoSfpUbY0obo2cKrnXqJ9utQtOygH ai2Du92KtCrorTNlkAzGJWEVlzqUGeanPeC6rI2LflgFCXz/rbrpLUzg2FU77AXVaYCEtWsWLQyG 0xCr/0ef67Yk1sIJV5RS1vZjYLvJyWUMn424aP6fx08jVcVOqhj7Yso8SpJF9P2/y6qbufZVKFBu D8G553BZ3QKslKaOJxT26Ne0NQDa/RB6T31mRTp31y+nC4tFfAJ6W4idGVF1D7pTIbluvALlGxuq epqxCxNEOlQd2b/dfzB/W9NnFOU5AgMBAAGjggLmMIIC4jAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE sDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwHQYDVR0OBBYEFEXwNdidUIe9IxPmi5Wi 9VgyNyiPMB8GA1UdIwQYMBaAFK5Vg2/sMcq59x36r2sx88gd46y7MCsGA1UdEQQkMCKBIGN1c3Rv bWVyLXN1cHBvcnRAc2gtc29sdXRpb25zLmRlMIIBTAYDVR0gBIIBQzCCAT8wggE7BgsrBgEEAYG1 NwECAzCCASowLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYw gfcGCCsGAQUFBwICMIHqMCcWIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MAMCAQEa gb5UaGlzIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3JkaW5nIHRvIHRoZSBDbGFzcyAyIFZh bGlkYXRpb24gcmVxdWlyZW1lbnRzIG9mIHRoZSBTdGFydENvbSBDQSBwb2xpY3ksIHJlbGlhbmNl IG9ubHkgZm9yIHRoZSBpbnRlbmRlZCBwdXJwb3NlIGluIGNvbXBsaWFuY2Ugb2YgdGhlIHJlbHlp bmcgcGFydHkgb2JsaWdhdGlvbnMuMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwuc3RhcnRz c2wuY29tL2NydHUyLWNybC5jcmwwgY4GCCsGAQUFBwEBBIGBMH8wOQYIKwYBBQUHMAGGLWh0dHA6 Ly9vY3NwLnN0YXJ0c3NsLmNvbS9zdWIvY2xhc3MyL2NsaWVudC9jYTBCBggrBgEFBQcwAoY2aHR0 cDovL2FpYS5zdGFydHNzbC5jb20vY2VydHMvc3ViLmNsYXNzMi5jbGllbnQuY2EuY3J0MCMGA1Ud EgQcMBqGGGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tLzANBgkqhkiG9w0BAQUFAAOCAQEAuy+aMdeS 0X/+QzrbhEN76PCFDz4XqADodq3kVUEdGJNWgpmaYs4a2QK8QUVZL45K6iMbCQtj+1oy0KwNGTCx uaXbmmldqx8uRlVzcYJiUfACLzvAPuvSAubFyh7SSX5wckJGlasBi1UXlfWcehpvfzw6unhhv/wL XWez6chQpgnbGW1g7N1v6vXzBqzk7fMtvuAN+4EhvjjJYgy1XeKjmCJ+xmQPhSXrzY6CjLeTKwH3 H0vifrWwjDpsipCRCyw1rRRMhEjlrJBbt4iGcGHCV8fj0qyx0jgEE2Tv/BFxu2TG3gtr1zrQPkLg ACnDmeNRpwf7Zx5O9g0T9xXfKPRD8DCCB8kwggWxoAMCAQICAQEwDQYJKoZIhvcNAQEFBQAwfTEL MAkGA1UEBhMCSUwxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdp dGFsIENlcnRpZmljYXRlIFNpZ25pbmcxKTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24g QXV0aG9yaXR5MB4XDTA2MDkxNzE5NDYzNloXDTM2MDkxNzE5NDYzNlowfTELMAkGA1UEBhMCSUwx FjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xKzApBgNVBAsTIlNlY3VyZSBEaWdpdGFsIENlcnRpZmlj YXRlIFNpZ25pbmcxKTAnBgNVBAMTIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIC IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwYjbCbxsRnx4n5V7tTOQ8nJi1sE2ICIkXs7p d/JDCqIGZKTMjjb4OOYj8G5tsTzdcqOFHKHTPbQzK9Mvr/7qsEFZZ7bEBn0KnnSF1nlMgDd63zkF Uln39BtGQ6TShYXSw3HzdWI0uiyKfx6P7u000BHHls1SPboz1t1N3gs7SkufwiYv+rUWHHI1d8o8 XebK4SaLGjZ2XAHbdBQl/u21oIgP3XjKLR8HlzABLXJ5+kbWEyqouaarg0kd5fLv3eQBjhgKj2NT FoViqQ4ZOsy1ZqbCa3QH5Cvhdj60bdj2ROFzYh87xL6gU1YlbFEJ96qryr92/W2b853bvz1mvAxW qq+YSJU6S9+nWFDZOHWpW+pDDAL/mevobE1wWyllnN2qXcyvATHsDOvSjejqnHvmbvcnZgwaSNdu QuM/3iE+e+ENcPtjqqhsGlS0XCV6yaLJixamuyx+F14FTVhuEh0B7hIQDcYyfxj//PT6zW6R6DZJ vhpIaYvClk0aErJpF8EKkNb6eSJIv7p7afhwx/p6N9jYDdJ2T1f/kLfjkdLd78Jgt2c63f6qnPDU i39yIs7Gn5e2+K+KoBCo2fsYxra1XFI8ibYZKnMBCg8DsxJg8novgdujbv8mMJf1i92JV7atPbOv K8W3dgLwpdYrmoYUKnL24zOMXQlLE9+7jHQTUksCAwEAAaOCAlIwggJOMAwGA1UdEwQFMAMBAf8w CwYDVR0PBAQDAgGuMB0GA1UdDgQWBBROC+8apEBbpRdphzDKNGhD0EGu8jBkBgNVHR8EXTBbMCyg KqAohiZodHRwOi8vY2VydC5zdGFydGNvbS5vcmcvc2ZzY2EtY3JsLmNybDAroCmgJ4YlaHR0cDov L2NybC5zdGFydGNvbS5vcmcvc2ZzY2EtY3JsLmNybDCCAV0GA1UdIASCAVQwggFQMIIBTAYLKwYB BAGBtTcBAQEwggE7MC8GCCsGAQUFBwIBFiNodHRwOi8vY2VydC5zdGFydGNvbS5vcmcvcG9saWN5 LnBkZjA1BggrBgEFBQcCARYpaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2ludGVybWVkaWF0ZS5w ZGYwgdAGCCsGAQUFBwICMIHDMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMC AQEagZdMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlv bnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxh YmxlIGF0IGh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMBEGCWCGSAGG+EIBAQQE AwIABzA4BglghkgBhvhCAQ0EKxYpU3RhcnRDb20gRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwDQYJKoZIhvcNAQEFBQADggIBABZsmfRmDDT10IVefQrs2hBOOBxe36YlBUuRMsHoO/E9 3UQJWwdJiinLZgK3sZr3JZgJPI4b4d02hytLu2jTOWY9oCbH8jmRHVGrgnt+1c5a5OIDV3Bplwj5 XlimCt+MBppFFhY4Cl5X9mLHegIF5rwetfKe9Kkpg/iyFONuKIdEw5Aa3jipPKxDTWRFzt0oqVzy c3sE+Bfoq7HzLlxkbnMxOhK4vLMR5H2PgVGaO42J9E2TZns8A+3Tmh2a82VQ9aDQdZ8vr/DqgkOY +GmciXnEQ45GcuNkNhKv9yUeOImQd37Da2q5w8tES6x4kIvnxyweSxFEyDRSJ80KXZ+FwYnVGnjy lRBTMt2AhGZ12bVoKPthLr6EqDjAmRKGpR5nZK0GLi+pcIXHlg98iWX1jkNUDqvdpYA5lGDANMmW cCyjEvUfSHu9HH5rt52Q9CI7rvj8Ksr6glKg769LVZPrwbXwIousNE4mIgShhyx1SrflfRPXuAxk wDbSyS+GEowjCcEbgjtzSaNqV4eU5dZ4xZlDY+NN4Hct4WWZcmkEGkcJ5g8BViT7H78OealYLrnE CQF+lbptAAY+supKEDnY0Cv1v+x1v5cCxQkbCNxVN+KB+zeEQ2IgyudWS2Xq/mzBJJMkoTTrBf+a Iq6bfT/xZVEKpjBqs/SIHIAN/HKK6INeMYIEEjCCBA4CAQEwgZMwgYwxCzAJBgNVBAYTAklMMRYw FAYDVQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0 ZSBTaWduaW5nMTgwNgYDVQQDEy9TdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRl IENsaWVudCBDQQICS3QwDQYJYIZIAWUDBAIBBQCgggJPMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0B BwEwHAYJKoZIhvcNAQkFMQ8XDTE1MDkwNjIwMzMxMVowLwYJKoZIhvcNAQkEMSIEIOrtJvF1BLIu /QdsTuFAuqZPeGzwbhaNsPVnn7LaYfQeMIGTBgkqhkiG9w0BCQ8xgYUwgYIwCwYJYIZIAWUDBAEq MAsGCWCGSAFlAwQBFjAKBggqhkiG9w0DBzALBglghkgBZQMEAQIwDgYIKoZIhvcNAwICAgCAMA0G CCqGSIb3DQMCAgFAMAsGCWCGSAFlAwQCATALBglghkgBZQMEAgMwCwYJYIZIAWUDBAICMAcGBSsO AwIaMIGkBgkrBgEEAYI3EAQxgZYwgZMwgYwxCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENv bSBMdGQuMSswKQYDVQQLEyJTZWN1cmUgRGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMTgwNgYD VQQDEy9TdGFydENvbSBDbGFzcyAyIFByaW1hcnkgSW50ZXJtZWRpYXRlIENsaWVudCBDQQICS3Qw gaYGCyqGSIb3DQEJEAILMYGWoIGTMIGMMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20g THRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzE4MDYGA1UE AxMvU3RhcnRDb20gQ2xhc3MgMiBQcmltYXJ5IEludGVybWVkaWF0ZSBDbGllbnQgQ0ECAkt0MA0G CSqGSIb3DQEBAQUABIIBAJpB+ojYpSpq2YBSK/eCcm24IMQfaLdi4uME4wholUWRejtKptFiwhyc ZJ9v8F/LizUVFZzH1w7wFGeMARGm4lS2rdUho6FxkVNxb8nWTasK+RmkbLINzEdEsnSGSHgDPVNC bhDm+adBx66oNj42+RSpPp/+J/gEjAkTD8UPML8d3An4qjLhFq11afXUXSm9FosdMm+vCqSkP+XE YFSsyKmi7LTJWw4iwt1sRmE7i5+mH2/mfYOA9BKYiCGZYkc/bKqijqdIN97lh1qLQPNcZPgh21MU mx2d93WDreNubGGc26ax38kOaYogFYIm4ID7CnjzdN//wqMMmZO/TwU7fF0AAAAAAAA= ------=_NextPart_000_001F_01D0E8F4.02DEBB40--