Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755076AbdCISpf (ORCPT ); Thu, 9 Mar 2017 13:45:35 -0500 Received: from mx-rz-1.rrze.uni-erlangen.de ([131.188.11.20]:52910 "EHLO mx-rz-1.rrze.uni-erlangen.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755057AbdCISpd (ORCPT ); Thu, 9 Mar 2017 13:45:33 -0500 X-RRZE-Flag: Not-Spam X-RRZE-Submit-IP: 2001:470:6d:b82:9c54:b28a:849c:ab4b Subject: Re: [PATCH] x86/dmi: Switch dmi_remap to ioremap_cache To: Andy Lutomirski , Jean Delvare , x86@kernel.org References: <3147c38e51f439f3c8911db34c7d4ab22d854915.1453791969.git.luto@kernel.org> Cc: linux-kernel@vger.kernel.org, Andrew Morton , Andy Lutomirski , Arjan van de Ven , Borislav Petkov , Brian Gerst , Denys Vlasenko , "H. Peter Anvin" , Jean Delvare , Linus Torvalds , "Luis R. Rodriguez" , Peter Zijlstra , Thomas Gleixner , Toshi Kani , Ingo Molnar , problems@cip.cs.fau.de From: Julian Brost Message-ID: <1303553d-2975-daeb-1a3d-303228966c96@fau.de> Date: Thu, 9 Mar 2017 18:48:39 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 MIME-Version: 1.0 In-Reply-To: <3147c38e51f439f3c8911db34c7d4ab22d854915.1453791969.git.luto@kernel.org> Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-512; boundary="------------ms070402040500030102080400" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 12099 Lines: 214 This is a cryptographically signed message in MIME format. --------------ms070402040500030102080400 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 26.01.2016 08:06, Andy Lutomirski wrote: > DMI cacheability is very confused on x86. >=20 > dmi_early_remap uses early_ioremap, which uses FIXMAP_PAGE_IO, which > is __PAGE_KERNEL_IO, which is __PAGE_KERNEL, which is cached. Don't > ask me why this makes any sense. >=20 > dmi_remap uses ioremap, which requests an uncached mapping. > However, on non-EFI systems, the DMI data generally lives between > 0xf0000 and 0x100000, which is in the legacy ISA range, which > triggers a special case in the PAT code that overrides the cache > mode requested by ioremap and forces a WB mapping. >=20 > On a UEFI boot, however, the DMI table can live at any physical > address. On my laptop, it's around 0x77dd0000. That's nowhere near > the legacy ISA range, so the ioremap implicit uncached type is > honored and we end up with a UC- mapping. >=20 > UC- is a very, very slow way to read from main memory, so dmi_walk > is likely to take much longer than necessary. >=20 > Given that, even on UEFI, we do early cached DMI reads, it seems > safe to just ask for cached access. Switch to ioremap_cache. >=20 > I haven't tried to benchmark this, but I'd guess it saves several > milliseconds of boot time. >=20 > Signed-off-by: Andy Lutomirski > --- > arch/x86/include/asm/dmi.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) >=20 > diff --git a/arch/x86/include/asm/dmi.h b/arch/x86/include/asm/dmi.h > index 535192f6bfad..3c69fed215c5 100644 > --- a/arch/x86/include/asm/dmi.h > +++ b/arch/x86/include/asm/dmi.h > @@ -15,7 +15,7 @@ static __always_inline __init void *dmi_alloc(unsigne= d len) > /* Use early IO mappings for DMI because it's initialized early */ > #define dmi_early_remap early_ioremap > #define dmi_early_unmap early_iounmap > -#define dmi_remap ioremap > +#define dmi_remap ioremap_cache > #define dmi_unmap iounmap > =20 > #endif /* _ASM_X86_DMI_H */ >=20 Hi, after updating from kernel 4.4 to 4.9, the hp-health tools stopped working on our HP servers (ProLiant DL380p Gen8 and DL380 Gen9, no others tested). Bisecting has shown commit ce1143a to be the cause. Reverting it on top of 4.9.13 solved the issue for us. In more detail, the hp-health tools fail to start because hpasmlited segfaults with the following log messages: hpasmlited[3218]: (SendRecv_CHIF) CpqCiSend: error=3D4, "Bad name for the= target connection object.". hpasmlited[3218]: (SendRecv_CHIF) CpqCiSend: error=3D4, "Bad name for the= target connection object.". hpasmlited[3218]: ehpsmb_parse_SMBIOS: SMBIOSInitTable was not successful= =2E hpasrd[3272]: WARNING: Can not open /dev/cpqhealth/casr. hpasrd[3272]: ERROR: Failed to get ASR enabled state. kernel: x86/PAT: hpasmlited:3218 map pfn expected mapping type uncached-minus for [mem 0xbfbdb000-0xbfbdcfff], got write-back kernel: hpasmlited[3218]: segfault at 0 ip 000000000040605b sp 00007ffea5f3beb0 error 4 in hpasmlited[400000+3a000] According to strace, this is one of the last actions of hpasmlited before it segfaults: mmap(NULL, 6176, PROT_READ, MAP_SHARED, 13, 0xbfbdb000) =3D -1 EAGAIN (Resource temporarily unavailable) I'm note entirely sure whether it's actually the kernel or HP to blame, but for now, hp-health is completely broken on 4.9 (probably on everything starting from 4.6), so this patch should be reviewed again. Regards, Julian --------------ms070402040500030102080400 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgMFADCABgkqhkiG9w0BBwEAAKCC Ei8wggTVMIIDvaADAgECAghQTsb1PRG0ZDANBgkqhkiG9w0BAQsFADBxMQswCQYDVQQGEwJE RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRy dXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNMTQw NzIyMTIwODI2WhcNMTkwNzA5MjM1OTAwWjBaMQswCQYDVQQGEwJERTETMBEGA1UEChMKREZO LVZlcmVpbjEQMA4GA1UECxMHREZOLVBLSTEkMCIGA1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xv YmFsIC0gRzAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6ZvDZ4X5Da71jVTD llA1PWLpbkztlNcAW5UidNQg6zSP1uzAMQQLmYHiphTSUqAoI4SLdIkEXlvg4njBeMsWyyg1 OXstkEXQ7aAAeny/Sg4bAMOG6VwrMRF7DPOCJEOMHDiLamgAmu7cT3ir0sYTm3at7t4m6O8B r3QPwQmi9mvOvdPNFDBP9eXjpMhim4IaAycwDQJlYE3t0QkjKpY1WCfTdsZxtpAdxO3/NYZ9 bzOz2w/FEcKKg6GUXUFr2NIQ9Uz9ylGs2b3vkoO72uuLFlZWQ8/h1RM9ph8nMM1JVNvJEzSa cXXFbOqnC5j5IZ0nrz6jOTlIaoytyZn7wxLyvQIDAQABo4IBhjCCAYIwDgYDVR0PAQH/BAQD AgEGMB0GA1UdDgQWBBRJt8bP6D0ff+pEexMp9/EKcD7eZDAfBgNVHSMEGDAWgBQxw3kbuvVT 1xfgiXotF2wKsyudMzASBgNVHRMBAf8ECDAGAQH/AgECMGIGA1UdIARbMFkwEQYPKwYBBAGB rSGCLAEBBAICMBEGDysGAQQBga0hgiwBAQQDADARBg8rBgEEAYGtIYIsAQEEAwEwDwYNKwYB BAGBrSGCLAEBBDANBgsrBgEEAYGtIYIsHjA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vcGtp MDMzNi50ZWxlc2VjLmRlL3JsL0RUX1JPT1RfQ0FfMi5jcmwweAYIKwYBBQUHAQEEbDBqMCwG CCsGAQUFBzABhiBodHRwOi8vb2NzcDAzMzYudGVsZXNlYy5kZS9vY3NwcjA6BggrBgEFBQcw AoYuaHR0cDovL3BraTAzMzYudGVsZXNlYy5kZS9jcnQvRFRfUk9PVF9DQV8yLmNlcjANBgkq hkiG9w0BAQsFAAOCAQEAYyAo/ZwhhnK+OUZZOTIlvKkBmw3Myn1BnIZtCm4ssxNZdbEzkhth Jxb/w7LVNYL7hCoBSb1mu2YvssIGXW4/buMBWlvKQ2NclbbhMacf1QdfTeZlgk4y+cN8ekvN TVx07iHydQLsUj7SyWrTkCNuSWc1vn9NVqTszC/Pt6GXqHI+ybxA1lqkCD3WvILDt7cyjrEs jmpttzUCGc/1OURYY6ckABCwu/xOr24vOLulV0k/2G5QbyyXltwdRpplic+uzPLl2Z9Tsz6h L5Kp2AvGhB8Exuse6J99tXulAvEkxSRjETTMWpMgKnmIOiVCkKllO3yG0xIVIyn8LNrMOVtU FzCCBYUwggRtoAMCAQICBxekJTUNxL8wDQYJKoZIhvcNAQELBQAwWjELMAkGA1UEBhMCREUx EzARBgNVBAoTCkRGTi1WZXJlaW4xEDAOBgNVBAsTB0RGTi1QS0kxJDAiBgNVBAMTG0RGTi1W ZXJlaW4gUENBIEdsb2JhbCAtIEcwMTAeFw0xNDA1MjcxNDU2MzdaFw0xOTA3MDkyMzU5MDBa MIGjMQswCQYDVQQGEwJERTEPMA0GA1UECBMGQmF5ZXJuMREwDwYDVQQHEwhFcmxhbmdlbjEo MCYGA1UEChMfVW5pdmVyc2l0YWV0IEVybGFuZ2VuLU51ZXJuYmVyZzENMAsGA1UECxMEUlJa RTEPMA0GA1UEAxMGRkFVLUNBMSYwJAYJKoZIhvcNAQkBFhdjYUBycnplLnVuaS1lcmxhbmdl bi5kZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALeM6O3UbAkUYBzi+4jBEF8F klzGxWvAHHou8+iNKcRVMU9fMiuJ/n4KuH/3AgzGloyieClmOqe/KlIhWURtMwsOmD3rMclX p9ilG7eIU70uE82az1Cw7N2V3o9tlIPlDH61ZXK8XCQO05u/zubqLREeOidcV+irlur548hu y+iURMGuowGgH1tm9l1X3735XqkvkFwnUzUkhFiABwtajxIZ022gMCJba5RXj+LSZv+67MPT qQmdoMf3WSs8zpM854+RSSPNbinKDo4KARkfaNkTib36HPMfMTu5ViBR5TIuRJ/gAHtV3YC+ Uccjpj/y4XUN+EoqsqODlFsVv994KAkCAwEAAaOCAgQwggIAMBIGA1UdEwEB/wQIMAYBAf8C AQEwDgYDVR0PAQH/BAQDAgEGMBEGA1UdIAQKMAgwBgYEVR0gADAdBgNVHQ4EFgQU9HPz+sZC s8ZcacBYvnQ4+WErjmIwHwYDVR0jBBgwFoAUSbfGz+g9H3/qRHsTKffxCnA+3mQwIgYDVR0R BBswGYEXY2FAcnJ6ZS51bmktZXJsYW5nZW4uZGUwgYgGA1UdHwSBgDB+MD2gO6A5hjdodHRw Oi8vY2RwMS5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD2g O6A5hjdodHRwOi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jcmwvY2Fj cmwuY3JsMIHXBggrBgEFBQcBAQSByjCBxzAzBggrBgEFBQcwAYYnaHR0cDovL29jc3AucGNh LmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEcGCCsGAQUFBzAChjtodHRwOi8vY2RwMS5wY2Eu ZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBHBggrBgEFBQcw AoY7aHR0cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY2FjZXJ0L2Nh Y2VydC5jcnQwDQYJKoZIhvcNAQELBQADggEBAAvdv5tQXS8Y3D2t/HCEcmY7UzcK/b8XU6IY 0o8b25SNIVX0qkNyC6nkx2NJNpas2cCVs5PgKmAV59oCiNupcUBJ126wiTlzuy4wI1YSJgHw PX0rEMLefI/6YAfxgCqH0fcRy0WS845CSZNY7raVwyZBjrvCYio0i2jmniSAT6RPfWATXsrB l3gmfBtJ7OFt0l1zLeKhhPhMeIUMojGUKsdyMslBC6Qm5UDA/N683/eGCfk3KOwKVQZ06hml bEDwfa8j70R3XFmOVDCKcXJWlTRA/TAExQCz4Y0AWoZJ76PdMzQtjIKpvBq2Kh4L8D5azsp0 lBqMJ/8X8jD51omx47cwggfJMIIGsaADAgECAgwckxwguJ0dR3j4L/UwDQYJKoZIhvcNAQEL BQAwgaMxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4xETAPBgNVBAcTCEVybGFuZ2Vu MSgwJgYDVQQKEx9Vbml2ZXJzaXRhZXQgRXJsYW5nZW4tTnVlcm5iZXJnMQ0wCwYDVQQLEwRS UlpFMQ8wDQYDVQQDEwZGQVUtQ0ExJjAkBgkqhkiG9w0BCQEWF2NhQHJyemUudW5pLWVybGFu Z2VuLmRlMB4XDTE3MDEwOTE0MzA0MFoXDTE5MDcwOTIzNTkwMFowgYYxCzAJBgNVBAYTAkRF MQ8wDQYDVQQIDAZCYXllcm4xETAPBgNVBAcMCEVybGFuZ2VuMTwwOgYDVQQKDDNGcmllZHJp Y2gtQWxleGFuZGVyLVVuaXZlcnNpdGFldCBFcmxhbmdlbi1OdWVybmJlcmcxFTATBgNVBAMM DEp1bGlhbiBCcm9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALU+Q8zFUIr8 mY3DJoPCM2SKIcdGPfZJEi6/v8xdLK1u/5gj+T5dCSsTcMXsx2Eb6KbPhNZXjMEzN6Z03ssc gtKTJ9uug1+4MHkjVzabbZihfXAntHgf8IRCsMlbNEu5UnFj6xqVuP/kuQazOh3GDjbnALnK 0HyUiMW0OmW5QM+w9FUqDRcDZKmESBf8okmqvp/BAxgnlwnUjM+w/hvDSLIbBTdpilbRG01Y UnDRcwB6EWBBWEKUEeblrdyaez5cXGXSZcpw6EQob1GFwGYFWRnP55PJQSa6CLtqrmkDhlBe ZcwMe3BCQjaOHfQ7kw4vG4eDrR1HSIj7gsrSr1ctf3NaPMlkkERDmQrzmv/2mSpdspzKPF8K N5hGxvwgN7cE1vNOej8G5R/Jzpr2mqC+vePmxPFITB1oy738tsXMcNJumTw+xcIYWL7eRyeN dS6KI1CBmZsny1Y5gcxIhqJdKMuUVXyCxOg2E0cgA90/3ncGDA0/8spc5I2oHH9+ZenlJ1nk A7Q30wEWd3fbc01vtuaYBgsih/ENVe9z9xN7fFFKvCF4nQEGKbjynQwTSgQZUJI+hb0H4sd+ 6fe91CTU893ipfSCad+mODUPVTRfwOKh8fi6NVevdbCKOutvmMpXAGieURh/pHc9fEoLVOz4 ROZhzIjpAhMvzbUe/G4JQ/LDAgMBAAGjggMWMIIDEjBABgNVHSAEOTA3MBEGDysGAQQBga0h giwBAQQDBTARBg8rBgEEAYGtIYIsAgEEAwEwDwYNKwYBBAGBrSGCLAEBBDAJBgNVHRMEAjAA MA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwHQYDVR0O BBYEFJiW7TZVe44TgGKQaFD7tP+L1HsBMB8GA1UdIwQYMBaAFPRz8/rGQrPGXGnAWL50OPlh K45iMIHBBgNVHREEgbkwgbaBE2p1bGlhbi5icm9zdEBmYXUuZGWBG2p1bGlhbi5icm9zdEBz dHVkaXVtLmZhdS5kZYEWdnUyMHd5bGlAY2lwLmNzLmZhdS5kZYEndnUyMHd5bGlAY2lwLmlu Zm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlgRd2dTIwd3lsaUBzdHVkLmNzLmZhdS5kZYEodnUy MHd5bGlAc3R1ZC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZTCBnwYDVR0fBIGXMIGUMEig RqBEhkJodHRwOi8vY2RwMS5wY2EuZGZuLmRlL3VuaS1lcmxhbmdlbi1udWVybmJlcmctY2Ev cHViL2NybC9jYWNybC5jcmwwSKBGoESGQmh0dHA6Ly9jZHAyLnBjYS5kZm4uZGUvdW5pLWVy bGFuZ2VuLW51ZXJuYmVyZy1jYS9wdWIvY3JsL2NhY3JsLmNybDCB7QYIKwYBBQUHAQEEgeAw gd0wMwYIKwYBBQUHMAGGJ2h0dHA6Ly9vY3NwLnBjYS5kZm4uZGUvT0NTUC1TZXJ2ZXIvT0NT UDBSBggrBgEFBQcwAoZGaHR0cDovL2NkcDEucGNhLmRmbi5kZS91bmktZXJsYW5nZW4tbnVl cm5iZXJnLWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNydDBSBggrBgEFBQcwAoZGaHR0cDovL2Nk cDIucGNhLmRmbi5kZS91bmktZXJsYW5nZW4tbnVlcm5iZXJnLWNhL3B1Yi9jYWNlcnQvY2Fj ZXJ0LmNydDANBgkqhkiG9w0BAQsFAAOCAQEAlqVW3qxonprQ5FFBx4K2OB77xrSCoJrB8VKR HPHbANLnpRezdcddeX6K3Pzyi1sbvQhDzf4vIay30GbG4GJ6u5i+JMpljnmuXwemGTDz4aYG fhnI3b8V9W4LyCsdIFx4W+jQEKp1BlZy8tnZFidnycmgeRhsodLUabU6YEjfnqeHEURgA9Vc BQv8U8CbBpCpE8dPUVdbKa3KYGhJes/ffiEvSO1SZSuTDCywLYrxpFB3rvtOsjUP3YZ60bxe scdjpeT/31m6SAaQAWFJmxnIRzNoY0huycjOhaP0zdohCbftCngGzZelxcWmNAU7YZikLKrQ 2DO67o/zHszcprmLAzGCBW0wggVpAgEBMIG0MIGjMQswCQYDVQQGEwJERTEPMA0GA1UECBMG QmF5ZXJuMREwDwYDVQQHEwhFcmxhbmdlbjEoMCYGA1UEChMfVW5pdmVyc2l0YWV0IEVybGFu Z2VuLU51ZXJuYmVyZzENMAsGA1UECxMEUlJaRTEPMA0GA1UEAxMGRkFVLUNBMSYwJAYJKoZI hvcNAQkBFhdjYUBycnplLnVuaS1lcmxhbmdlbi5kZQIMHJMcILidHUd4+C/1MA0GCWCGSAFl AwQCAwUAoIICiTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x NzAzMDkxNzQ4MzlaME8GCSqGSIb3DQEJBDFCBEDYGHWF6jC+ttN2CtxxZqBAglcxL3AFglol 6rJwqnrr2A9ZzhbnAluH48uO3G1CyeEfzBRo4XsePNOHqvI42EbiMGwGCSqGSIb3DQEJDzFf MF0wCwYJYIZIAWUDBAEqMAsGCWCGSAFlAwQBAjAKBggqhkiG9w0DBzAOBggqhkiG9w0DAgIC AIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYIKoZIhvcNAwICASgwgcUGCSsGAQQBgjcQ BDGBtzCBtDCBozELMAkGA1UEBhMCREUxDzANBgNVBAgTBkJheWVybjERMA8GA1UEBxMIRXJs YW5nZW4xKDAmBgNVBAoTH1VuaXZlcnNpdGFldCBFcmxhbmdlbi1OdWVybmJlcmcxDTALBgNV BAsTBFJSWkUxDzANBgNVBAMTBkZBVS1DQTEmMCQGCSqGSIb3DQEJARYXY2FAcnJ6ZS51bmkt ZXJsYW5nZW4uZGUCDByTHCC4nR1HePgv9TCBxwYLKoZIhvcNAQkQAgsxgbeggbQwgaMxCzAJ BgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4xETAPBgNVBAcTCEVybGFuZ2VuMSgwJgYDVQQK Ex9Vbml2ZXJzaXRhZXQgRXJsYW5nZW4tTnVlcm5iZXJnMQ0wCwYDVQQLEwRSUlpFMQ8wDQYD VQQDEwZGQVUtQ0ExJjAkBgkqhkiG9w0BCQEWF2NhQHJyemUudW5pLWVybGFuZ2VuLmRlAgwc kxwguJ0dR3j4L/UwDQYJKoZIhvcNAQEBBQAEggIAICUu3aO7LMyVNcUIEWlv3/k85P+aslvX Iw8mEBL+huilU3yzmug58WJQJRLL6glrAebF/tCselVaNKeB09jwwhi//cP4oyGVsUz4B44I s+raYAlh1ZFTYP57RtoKoS6RSFvTfmcVefU0K3eKEEk5y2fSMrHiv5OJ/oCVryXEDwNoS9KZ eygh1ttn4IFCnQovaaHmibEdGTe0f41et0FXToUwKaBV13uxt/c5W2AlhEBh8pE1k/XUVWm+ 4M3B8WCvho5TvNX9lS4Sw8yUyl4ZXsOvxdRfMlsnj1GqQTw1d24E1/uTZSszehsQpCm+e3bg dxOOLL0qRdS4lFK8Iu0o7/CW3f3ByBW8zysKSqublFKeQK35lQLlC37CfeoKcmwevc2AAXJq Lault+NhzEHS1lMfiH1EQQyHralRVrxvy/apMs7yvJHRG+WQcWXwmXYAXS9XGUnnS1HvsL/j CrvRljCdPnQx5YS2p9dcE4eolXMsXgtl8qYutw93Aq2L8XMH14z6eZEvT8q5xuEksnpf4WCZ px4vrvfgeh0bzuNEw5/wIaPd+mlwWtr4+zkTBwsoVmPtry3nSXvSCRMs2bkzV8p39qkkbasx LFnFO6x8Zw+fBtMO3JIq9fG8mBw+JyjnHMwgzMvY3EPiYu26xwLRkI7f3kAZhtdDqgTtiPcH GqcAAAAAAAA= --------------ms070402040500030102080400--