From dee59f333bb88f507eb50abaa3e22da53fceb5aa Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Thu, 22 Nov 2018 11:06:58 +0100 Subject: [PATCH] Simplify Active Setup custom action names The "ca" prefix is redundant. --- ...hActiveSetup.js => EvaluateActiveSetup.js} | 122 ++++++++---------- ...teActiveSetup.js => PublishActiveSetup.js} | 122 ++++++++++-------- Core/Makefile | Bin 159060 -> 158980 bytes 3 files changed, 122 insertions(+), 122 deletions(-) rename Core/Binary/{caPublishActiveSetup.js => EvaluateActiveSetup.js} (75%) rename Core/Binary/{caEvaluateActiveSetup.js => PublishActiveSetup.js} (75%) diff --git a/Core/Binary/caPublishActiveSetup.js b/Core/Binary/EvaluateActiveSetup.js similarity index 75% rename from Core/Binary/caPublishActiveSetup.js rename to Core/Binary/EvaluateActiveSetup.js index 34313ce..0cbff70 100644 --- a/Core/Binary/caPublishActiveSetup.js +++ b/Core/Binary/EvaluateActiveSetup.js @@ -17,60 +17,44 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - + /** - * Publishes Active Setup component - * - * This is a deffered execution action. CustomActionData property should be - * one of: - * - * "install\t\t\t" - * Installs Active Setup component - * - * "uninstall\t" - * Marks Active Setup component as uninstalled + * Evaluates Active Setup component state and prepares instructions for + * PublishActiveSetup deferred action. */ -var data = Session.Property("CustomActionData").split("\t"); -if (data && data.length >= 2) { - var - wsh = new ActiveXObject("WScript.Shell"), - regPath = "HKLM\\Software\\Microsoft\\Active Setup\\Installed Components\\" + data[1] + "\\"; +var + productCode = Session.Property("ProductCode"), + version; - switch (data[0].toLowerCase()) { - case "install": - if (data.length >= 4) { - // Register component. - wsh.RegWrite(regPath, data[2], "REG_SZ"); - wsh.RegWrite(regPath + "Version", data[3], "REG_SZ"); - - // Mark component as installed. - wsh.RegWrite(regPath + "IsInstalled", 1, "REG_DWORD"); - wsh.RegWrite(regPath + "DontAsk" , 2, "REG_DWORD"); - - // Set action to execute on user logon. - wsh.RegWrite(regPath + "StubPath", "\"%SystemRoot%\\system32\\msiexec.exe\" /fu \"" + data[1] + "\" /qn", "REG_EXPAND_SZ"); - } - break; - - case "uninstall": - // Mark component as uninstalled. - wsh.RegWrite(regPath + "IsInstalled", 0, "REG_DWORD"); - - // We should have set the StubPath to execute cleanup. Unfortunately, when - // the StubPath gets executed, the MSI package is gone already. So, a - // `msiexec /x [ProductCode] /qn` is not possible any more. - wsh.RegDelete(regPath + "StubPath"); - break; - } +// Read the current component version from registry. Default to "0". +try { + var wsh = new ActiveXObject("WScript.Shell"); + version = new String(wsh.RegRead("HKLM\\Software\\Microsoft\\Active Setup\\Installed Components\\" + productCode + "\\" + "Version")); + if (!version || version.length == 0) + throw new Error("Active Setup component version not found."); +} catch (err) { + version = "0"; } +// Increment the last version component. +var v = version.split(",").slice(0, 4); +v[v.length - 1] = (parseInt(v[v.length - 1], 10) + 1).toString(); +version = v.join(","); + +// Save the data for deferred action. +Session.Property("PublishActiveSetup") = + (Session.EvaluateCondition("REMOVE=\"ALL\"") == 1/*msiEvaluateConditionTrue*/ ? + ["uninstall", productCode] : + ["install", productCode, Session.Property("ProductName"), version] + ).join("\t"); + // SIG // Begin signature block // SIG // MIIWvAYJKoZIhvcNAQcCoIIWrTCCFqkCAQExDzANBglg // SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor // SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC // SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg -// SIG // Qi9+9yJcVsC2G6qWqsJZUNPauR9SC1GK5YnxOzqhq/ug +// SIG // SWSLF8o2K03U8TaA037RPgFhLQkNjuHVIcHTrIoDM/qg // SIG // ggtpMIIFgTCCBGmgAwIBAgIRAIJkBWOYIGrN1XByRZuP // SIG // G5IwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCR0Ix // SIG // GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G @@ -167,23 +151,23 @@ if (data && data.length >= 2) { // SIG // ZAVjmCBqzdVwckWbjxuSMA0GCWCGSAFlAwQCAQUAoHww // SIG // EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwG // SIG // CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG -// SIG // AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIAjNaloaL/xM -// SIG // B0UyKoXYq0egvakd4tV5PYbfbxxFOMcXMA0GCSqGSIb3 -// SIG // DQEBAQUABIIBAA9IQVEMX8G91PwyenSfXE3Ib4N/sGGJ -// SIG // zJ3H6oAwPLXBnZeOKtagG5OZtZ2LMeAtU5E62HEgtWQQ -// SIG // YdHVH+lITGbsS73KRp24k5MzC2TfNzGobGX33X4p4zot -// SIG // W4n2AJ/yjS3dVrpRiJjwfsrNl3fM3CvH/TawgTopqdWp -// SIG // 4rRfPcMguzimYwseoXO9P2lg4lQvImvO1XR6HCXXbbuF -// SIG // xuLcfKhgdLnsb2WicwDnDSCA4JxdIPfwGKUkb71LxmQ/ -// SIG // uYEHnWk54kdiWCnriQKUIMgaAhBUlktlZOJPl6LhFhZi -// SIG // kx4Ve37WQXC7CqPBnnHcRKK0s+fXhCgvvdkcj1X049Ut -// SIG // 69KhgghrMIIIZwYKKwYBBAGCNwMDATGCCFcwgghTBgkq +// SIG // AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIAGEfbPfd2yc +// SIG // q3KoaecnqjhrsowXUEfnN+cl+I7EsAaNMA0GCSqGSIb3 +// SIG // DQEBAQUABIIBAJ11ijk6V39NHEwz2/OqbpyVJSmHZptq +// SIG // W8bnRMxEpumdNxcuvi8fSjRXHYhC3OBJdyqM0YoQjoYU +// SIG // X7iMyJwMvk5F9on+J0wtL1fnQwHvQG95E/e4VEsKv0Sq +// SIG // aow0QeXY+mm/5MH209cCH0XjnanKVa87eSWIY/eLV7KD +// SIG // g7HE66e9rZiX/oCyPrUte1DA6c0/+acQzV/2+ag/zolc +// SIG // S9gKVI1ar3nd/nRrhVUxyCwKAkMCFhi1KLV1MoojIISN +// SIG // ABHDpxcJnMklp+5CxklfdawvX0gp0C4Xw8jPs1v/RoEh +// SIG // fTt/w08eraaWoNeW9Ir9cTbnySI6sxOM4IVT1AcZDvYN +// SIG // L/KhgghrMIIIZwYKKwYBBAGCNwMDATGCCFcwgghTBgkq // SIG // hkiG9w0BBwKggghEMIIIQAIBAzEPMA0GCWCGSAFlAwQC // SIG // AQUAMIIBDwYLKoZIhvcNAQkQAQSggf8EgfwwgfkCAQEG -// SIG // CisGAQQBsjECAQEwMTANBglghkgBZQMEAgEFAAQgSqjE -// SIG // oaABn8z8cBD1ly5UDN5KXb2gJpBNzNMg0ur0PJYCFQD7 -// SIG // DGbnRGSjao94Kd4SSbl9ocX3ChgPMjAxODExMjIwOTE3 -// SIG // MjZaoIGMpIGJMIGGMQswCQYDVQQGEwJHQjEbMBkGA1UE +// SIG // CisGAQQBsjECAQEwMTANBglghkgBZQMEAgEFAAQgW5U2 +// SIG // mdsb1u5q2cHxPwFhkAx4uboqBfTFJgBfzAbPTCgCFQCU +// SIG // 8P2BcdBMZS1Bqft8ZCMqgIX36hgPMjAxODExMjIxMDA1 +// SIG // NTJaoIGMpIGJMIGGMQswCQYDVQQGEwJHQjEbMBkGA1UE // SIG // CBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdT // SIG // YWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRl // SIG // ZDEsMCoGA1UEAxMjQ09NT0RPIFNIQS0yNTYgVGltZSBT @@ -231,16 +215,16 @@ if (data && data.length >= 2) { // SIG // U0VSRmlyc3QtT2JqZWN0AhBOsIePzCQ1NrLYyfe/OVV3 // SIG // MA0GCWCGSAFlAwQCAQUAoIGYMBoGCSqGSIb3DQEJAzEN // SIG // BgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMTgx -// SIG // MTIyMDkxNzI2WjArBgsqhkiG9w0BCRACDDEcMBowGDAW +// SIG // MTIyMTAwNTUyWjArBgsqhkiG9w0BCRACDDEcMBowGDAW // SIG // BBQ2Un1Pompo+etFlvHZmrssDqdt+jAvBgkqhkiG9w0B -// SIG // CQQxIgQgc9ROfOXHnwYMTogXYqZ2HmJTAZAMdS1YfFck -// SIG // SNYjwFUwDQYJKoZIhvcNAQEBBQAEggEAEJ7SnnXSLupt -// SIG // pDgy+6tgNvGsgbWR8Vnwtvjdam0a2FJCh8XvMOEnLpdp -// SIG // RzvNospGYa4kLlDfxI54OkPEo98u68V4d96z+4fCME/O -// SIG // kfRlSe0Y1uut7GHi0mdzTUjKbjDTeRq8OUknj/Rj3uRe -// SIG // yObso2iLS4FjBi8YUtSTdKKTqwOHlhMHMUHUZ5Kyem1l -// SIG // nTa2SbHNOvhSKOXkCL/DB8CHdUkYZid4xTq39+2Glum0 -// SIG // E8JbeM1dJIFONIYaIKONCL/FCD5IZsSjyom36O0VrubG -// SIG // eI1PUr0+bvlD/iDP0X9T1gJGk9CbMPBlFF7ZZhcQP7mE -// SIG // VmmmG6JNOE6eJ5EHi9GNwA== +// SIG // CQQxIgQgoGqHEqN/motOUgOkwPZQlfWe2oj8nQmpXQxW +// SIG // IYWsXa4wDQYJKoZIhvcNAQEBBQAEggEAEmHw6kbuV6E3 +// SIG // d0TRW9eKaIH013Skne/SK4e4dprOkGsDgEdjnW9xof18 +// SIG // 978puHM6vkr54jkMTMC5RfYXgvwmvKAjFd6zMTrmhp0n +// SIG // 52lTWov7xGFCR/3aXfStCrRFKYW6INc5laLIs1IK+8G6 +// SIG // VBN4tTjh1bCAuZeMD9xuhzbCZ7NtacJn5gBEY51T+6T4 +// SIG // 5dMsw2U4iFQ9RoeOg+T0KfmeJtfIQrJ93/dPSEZDkkq2 +// SIG // BU7PiUi17WT4u2YU7EJZzjTGjRn+bRz7oTdMaM1mkUzZ +// SIG // o8WpXRZz9m6yRxOgG7aCVQZl4MH/eaowQs7ninN0B5TE +// SIG // zxoXoQdxQCCuwVKExwo1BQ== // SIG // End signature block diff --git a/Core/Binary/caEvaluateActiveSetup.js b/Core/Binary/PublishActiveSetup.js similarity index 75% rename from Core/Binary/caEvaluateActiveSetup.js rename to Core/Binary/PublishActiveSetup.js index 64289eb..89f6531 100644 --- a/Core/Binary/caEvaluateActiveSetup.js +++ b/Core/Binary/PublishActiveSetup.js @@ -17,44 +17,60 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - + /** - * Evaluates Active Setup component state and prepares instructions for - * caPublishActiveSetup deferred action. + * Publishes Active Setup component + * + * This is a deffered execution action. CustomActionData property should be + * one of: + * + * "install\t\t\t" + * Installs Active Setup component + * + * "uninstall\t" + * Marks Active Setup component as uninstalled */ -var - productCode = Session.Property("ProductCode"), - version; +var data = Session.Property("CustomActionData").split("\t"); +if (data && data.length >= 2) { + var + wsh = new ActiveXObject("WScript.Shell"), + regPath = "HKLM\\Software\\Microsoft\\Active Setup\\Installed Components\\" + data[1] + "\\"; -// Read the current component version from registry. Default to "0". -try { - var wsh = new ActiveXObject("WScript.Shell"); - version = new String(wsh.RegRead("HKLM\\Software\\Microsoft\\Active Setup\\Installed Components\\" + productCode + "\\" + "Version")); - if (!version || version.length == 0) - throw new Error("Active Setup component version not found."); -} catch (err) { - version = "0"; + switch (data[0].toLowerCase()) { + case "install": + if (data.length >= 4) { + // Register component. + wsh.RegWrite(regPath, data[2], "REG_SZ"); + wsh.RegWrite(regPath + "Version", data[3], "REG_SZ"); + + // Mark component as installed. + wsh.RegWrite(regPath + "IsInstalled", 1, "REG_DWORD"); + wsh.RegWrite(regPath + "DontAsk" , 2, "REG_DWORD"); + + // Set action to execute on user logon. + wsh.RegWrite(regPath + "StubPath", "\"%SystemRoot%\\system32\\msiexec.exe\" /fu \"" + data[1] + "\" /qn", "REG_EXPAND_SZ"); + } + break; + + case "uninstall": + // Mark component as uninstalled. + wsh.RegWrite(regPath + "IsInstalled", 0, "REG_DWORD"); + + // We should have set the StubPath to execute cleanup. Unfortunately, when + // the StubPath gets executed, the MSI package is gone already. So, a + // `msiexec /x [ProductCode] /qn` is not possible any more. + wsh.RegDelete(regPath + "StubPath"); + break; + } } -// Increment the last version component. -var v = version.split(",").slice(0, 4); -v[v.length - 1] = (parseInt(v[v.length - 1], 10) + 1).toString(); -version = v.join(","); - -// Save the data for deferred action. -Session.Property("caPublishActiveSetup") = - (Session.EvaluateCondition("REMOVE=\"ALL\"") == 1/*msiEvaluateConditionTrue*/ ? - ["uninstall", productCode] : - ["install", productCode, Session.Property("ProductName"), version] - ).join("\t"); - // SIG // Begin signature block // SIG // MIIWuwYJKoZIhvcNAQcCoIIWrDCCFqgCAQExDzANBglg // SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor // SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC // SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg -// SIG // qLs6xdcTzN5XcXZQEgFJRaZm0g2VNpVyt0hdA7txV06g +// SIG // kMMxMz1Ef3Ep3DW9uQLGluhMziYbqAt1jqmtSruYId2g // SIG // ggtpMIIFgTCCBGmgAwIBAgIRAIJkBWOYIGrN1XByRZuP // SIG // G5IwDQYJKoZIhvcNAQELBQAwfTELMAkGA1UEBhMCR0Ix // SIG // GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G @@ -151,23 +167,23 @@ Session.Property("caPublishActiveSetup") = // SIG // ZAVjmCBqzdVwckWbjxuSMA0GCWCGSAFlAwQCAQUAoHww // SIG // EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwG // SIG // CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG -// SIG // AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIHig0/VDN/Xa -// SIG // MiBDQCvu7tgVzz74vtOOoy/omeuHczRNMA0GCSqGSIb3 -// SIG // DQEBAQUABIIBAGd9kx4p4AFk32Aza7NTH0a0Fl5IIV3J -// SIG // uLIcSFOs0rvVFIouFj6LZVnC7H83P9BBSq8o8O7JzVa8 -// SIG // um2C0EFvI0R2Myxl/lnX1XCh8G9JVGyD+eue6D+O5Mj0 -// SIG // qSDfWJ+EuvAUMNmtvQL2t+kzFF0LNa/caz0ZV9Uhng21 -// SIG // LUjv9HfHOful+1FUv34Yoprz1YJCllvgRxaDiorMtCda -// SIG // ukjpRxYQ+7MfBnLqOJ7cXxq1m7ou6qisyS14IMd3MBVZ -// SIG // Tm7du4E+Pk0WnnEUc60n9jZNKGMlKkZixhy5rspaSTIB -// SIG // 3DITXpAwqpYvHgC/S17zIfnzsotVjZCXlSnT/+UAFWe9 -// SIG // 7eChgghqMIIIZgYKKwYBBAGCNwMDATGCCFYwgghSBgkq +// SIG // AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIK2hWUgvD9rV +// SIG // bhKYGB6Q+evJNZd3bj/8Zxir+menwUUrMA0GCSqGSIb3 +// SIG // DQEBAQUABIIBAMN6iO1euWhgV5eutx/0PxElNc1PUo79 +// SIG // Ul/OWrNviMOkjDl5xPKznhhOghjZ5/I2BqmYWZ80U9im +// SIG // fqpNHyVpE5BVuIrVXytIIdzr7EmZ5OfjUjDJZKI/RV4D +// SIG // uz6qUwzCLncguR/Ielw1E2Mc6pvXV34Ku6si5pSr8kLI +// SIG // 2SbUUUDDv6jeZ0wxRsWTle9j/2ESoTdcuvJueaZ4iGyl +// SIG // xnDpXwRx8G+ERlOU8+lbnceqtD4uKf1bG3Qexso04hrA +// SIG // 51Yvf7Q79l7uUEN978Se9Kna/ZgE9spGI+Ah351zasT0 +// SIG // Wp3w7BhH+R02q5l66VBwC0pkcqzMEulipG6sL7HvOCD9 +// SIG // 3NihgghqMIIIZgYKKwYBBAGCNwMDATGCCFYwgghSBgkq // SIG // hkiG9w0BBwKggghDMIIIPwIBAzEPMA0GCWCGSAFlAwQC // SIG // AQUAMIIBDgYLKoZIhvcNAQkQAQSggf4EgfswgfgCAQEG -// SIG // CisGAQQBsjECAQEwMTANBglghkgBZQMEAgEFAAQg6Fqo -// SIG // BjGTUVll2JoIjgn9JLmG1zigXEquVsDUGKGuPJcCFH7J -// SIG // us8L0fgwdoAtv6URfbNXumOgGA8yMDE4MTEyMjA5MTYy -// SIG // NFqggYykgYkwgYYxCzAJBgNVBAYTAkdCMRswGQYDVQQI +// SIG // CisGAQQBsjECAQEwMTANBglghkgBZQMEAgEFAAQgXFjA +// SIG // TYko6yEcxDIXslOR/w2X2DUqAiBx9/tIBMAZrCACFFs5 +// SIG // Dqa2fwvq/1InjBGgY7lxuzyVGA8yMDE4MTEyMjEwMDU1 +// SIG // NlqggYykgYkwgYYxCzAJBgNVBAYTAkdCMRswGQYDVQQI // SIG // ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh // SIG // bGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVk // SIG // MSwwKgYDVQQDEyNDT01PRE8gU0hBLTI1NiBUaW1lIFN0 @@ -215,16 +231,16 @@ Session.Property("caPublishActiveSetup") = // SIG // RVJGaXJzdC1PYmplY3QCEE6wh4/MJDU2stjJ9785VXcw // SIG // DQYJYIZIAWUDBAIBBQCggZgwGgYJKoZIhvcNAQkDMQ0G // SIG // CyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0xODEx -// SIG // MjIwOTE2MjRaMCsGCyqGSIb3DQEJEAIMMRwwGjAYMBYE +// SIG // MjIxMDA1NTZaMCsGCyqGSIb3DQEJEAIMMRwwGjAYMBYE // SIG // FDZSfU+iamj560WW8dmauywOp236MC8GCSqGSIb3DQEJ -// SIG // BDEiBCAKpoo7FQiH/YJkrRy120D1yElGyfzhsPemQxPT -// SIG // QMEzVzANBgkqhkiG9w0BAQEFAASCAQA/RFz0SnZvYzNs -// SIG // q1FyrP609KBvIYoRJTYGoAya3EIj1yMMHNXypTr1o5S5 -// SIG // aAL6n5dFc7p77TVimLKs/kRyFW75niuMwaLdMU0eEdFo -// SIG // MRIDKM2bVPg/BKM8sJPazDln7FEBaO9eGBQ49Cujxomx -// SIG // jcsvHREi7LyYOVX0hBQQ7kIbwouiW53p2+b7zJ/Nychl -// SIG // wVKgLn3vVLIRTJuxeTtdAz0yk8gfP9mPW1BS1QBUdfH6 -// SIG // afla97Y73ZB8wDxYRO122GYefgFYziveghkkoNhp9rtS -// SIG // uaes3AYg+/rq9/SfWJHQ1PoSkVdYk5PlTdtipEJKA4ac -// SIG // xHkNGthRHyQDEwx2JtjB +// SIG // BDEiBCA/IFBbYdDtFY07qVNIgj23YA69JuOdw+bX3OOa +// SIG // E9BSgzANBgkqhkiG9w0BAQEFAASCAQAPOp5DglKxgDBU +// SIG // Q8y7mnMpz9e9qlfTievUzDNtNwlm/TowKLJpDCjpajVV +// SIG // GOOYNMbKCEGVUQm60IJ1JO/UxSvIvqyX4xX+NiMR+mbh +// SIG // jGMRU3Q+Z8Sdwv1z63yC3EWUoLrJi+odfxEe8rixc+yi +// SIG // ksJAnIu9+6/hwlN9Sb0D9xYBzLHUYeOq9wUFkbWyOTMY +// SIG // LdyDYL61FDFnPe0mUy8NUVCy9QGzw5NeGNgNwkX6uzLC +// SIG // kSqbE3a9gTIJExQqSwtbb+CBrEf3SnOzqmyGDiueTts+ +// SIG // hWnswCJ8xHP3hSrebpsEx1jI1xjasbFyCysrp04w6oDB +// SIG // hYaGOyna8VLy+J55igOe // SIG // End signature block diff --git a/Core/Makefile b/Core/Makefile index 0c690a42e25bbdefa3a38b9bbe3acf17fe772891..d95f82f349903200eb240f1f01b6db4ab339a76c 100644 GIT binary patch delta 225 zcmca|i?ihxXTui8r0nU3@)`A}3*<0zOrMj@=rVm%0i(`#AXkrRx>FudW}7o3-}Hby zM!D$=@))^5(prq1(>E3{YJ&t=rt{=8Wdab`mIJruIW5L0;XJjx=kY^4~&PVS$+C~Mn(Y?6Sf0Q ukXis!ug=ZMz{z09V8&p|U@&