<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Aptos;
panose-1:2 11 0 4 2 2 2 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:12.0pt;
font-family:"Aptos",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
pre
{mso-style-priority:99;
mso-style-link:"HTML Preformatted Char";
margin:0cm;
font-size:10.0pt;
font-family:"Courier New";}
span.gmailsignatureprefix
{mso-style-name:gmail_signature_prefix;}
span.EmailStyle20
{mso-style-type:personal-reply;
font-family:"Aptos",sans-serif;
color:windowtext;}
span.HTMLPreformattedChar
{mso-style-name:"HTML Preformatted Char";
mso-style-priority:99;
mso-style-link:"HTML Preformatted";
font-family:"Courier New";}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
/* List Definitions */
@list l0
{mso-list-id:126625368;
mso-list-type:hybrid;
mso-list-template-ids:1291721720 1594525304 134807555 134807557 134807553 134807555 134807557 134807553 134807555 134807557;}
@list l0:level1
{mso-level-start-at:0;
mso-level-number-format:bullet;
mso-level-text:\F0D8 ;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:Wingdings;
mso-fareast-font-family:Aptos;
mso-bidi-font-family:"Times New Roman";}
@list l0:level2
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:"Courier New";}
@list l0:level3
{mso-level-number-format:bullet;
mso-level-text:\F0A7 ;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:Wingdings;}
@list l0:level4
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:Symbol;}
@list l0:level5
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:"Courier New";}
@list l0:level6
{mso-level-number-format:bullet;
mso-level-text:\F0A7 ;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:Wingdings;}
@list l0:level7
{mso-level-number-format:bullet;
mso-level-text:\F0B7 ;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:Symbol;}
@list l0:level8
{mso-level-number-format:bullet;
mso-level-text:o;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:"Courier New";}
@list l0:level9
{mso-level-number-format:bullet;
mso-level-text:\F0A7 ;
mso-level-tab-stop:none;
mso-level-number-position:left;
text-indent:-18.0pt;
font-family:Wingdings;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Hi,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Thank you for putting up this patch.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">In “source/common/cpu.cpp”, the test for Neon_I8MM is checking the wrong flag.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">The line:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">+ flags |= (hwcaps2 & HWCAP2_SVEI8MM ? X265_CPU_NEON_I8MM : 0);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Should be:<o:p></o:p></span></p>
<pre>+ flags |= (hwcaps2 & HWCAP2_I8MM ? X265_CPU_NEON_I8MM : 0);<o:p></o:p></pre>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Many thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US">Hari<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">x265-devel <x265-devel-bounces@videolan.org> on behalf of Dash Santosh <dash.sathyanarayanan@multicorewareinc.com><br>
<b>Date: </b>Thursday, 26 September 2024 at 07:13<br>
<b>To: </b>x265-devel@videolan.org <x265-devel@videolan.org><br>
<b>Subject: </b>[x265] [PATCH] AArch64: Runtime CPU feature detection<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">From e9614d170f93f3ad4f01e95abfed0a260f218bd5 Mon Sep 17 00:00:00 2001<br>
From: Min Chen <<a href="mailto:chenm003@163.com">chenm003@163.com</a>><br>
Date: Sat, 14 Sep 2024 14:25:28 -0700<br>
Subject: [PATCH] AArch64: Runtime CPU feature detection<br>
<br>
---<br>
source/CMakeLists.txt | 20 ++++++++++++--------<br>
source/common/CMakeLists.txt | 5 +++++<br>
source/common/cpu.cpp | 33 +++++++++++++++++++++++++++++++++<br>
3 files changed, 50 insertions(+), 8 deletions(-)<br>
<br>
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt<br>
index 37b83f959..32a99206f 100755<br>
--- a/source/CMakeLists.txt<br>
+++ b/source/CMakeLists.txt<br>
@@ -306,7 +306,8 @@ if(GCC)<br>
if(CPU_HAS_NEON_DOTPROD)<br>
# Neon DotProd is mandatory from Armv8.4.<br>
message(STATUS "Found Neon DotProd")<br>
- set(ARM_ARGS -O3 -march=armv8.2-a+dotprod)<br>
+ set(ARM64_ARCH_ARGS -march=armv8.2-a+dotprod)<br>
+ set(ARM_ARGS -O3)<br>
add_definitions(-DHAVE_NEON_DOTPROD=1)<br>
endif()<br>
if(CPU_HAS_NEON_I8MM)<br>
@@ -316,7 +317,8 @@ if(GCC)<br>
if(NOT CPU_HAS_NEON_DOTPROD)<br>
message(FATAL_ERROR "Unsupported AArch64 feature combination (Neon I8MM without Neon DotProd)")<br>
endif()<br>
- set(ARM_ARGS -O3 -march=armv8.2-a+dotprod+i8mm)<br>
+ set(ARM64_ARCH_ARGS -march=armv8.2-a+dotprod+i8mm)<br>
+ set(ARM_ARGS -O3)<br>
add_definitions(-DHAVE_NEON_I8MM=1)<br>
endif()<br>
if(CPU_HAS_SVE)<br>
@@ -325,13 +327,15 @@ if(GCC)<br>
if(NOT CPU_HAS_NEON_I8MM)<br>
message(FATAL_ERROR "Unsupported AArch64 feature combination (SVE without Neon I8MM)")<br>
endif()<br>
- set(ARM_ARGS -O3 -march=armv8.2-a+dotprod+i8mm+sve)<br>
+ set(ARM64_ARCH_ARGS -march=armv8.2-a+dotprod+i8mm+sve)<br>
+ set(ARM_ARGS -O3)<br>
add_definitions(-DHAVE_SVE=1)<br>
endif()<br>
if(CPU_HAS_SVE2)<br>
message(STATUS "Found SVE2")<br>
# SVE2 is only available from Armv9.0, and armv9-a implies +dotprod<br>
- set(ARM_ARGS -O3 -march=armv9-a+i8mm+sve2)<br>
+ set(ARM64_ARCH_ARGS -march=armv9-a+i8mm+sve2)<br>
+ set(ARM_ARGS -O3)<br>
add_definitions(-DHAVE_SVE2=1)<br>
endif()<br>
set(ARM_ARGS ${ARM_ARGS} -fPIC)<br>
@@ -692,7 +696,7 @@ if((MSVC_IDE OR XCODE OR GCC) AND ENABLE_ASSEMBLY)<br>
add_custom_command(<br>
OUTPUT ${ASM}.${SUFFIX}<br>
COMMAND ${CMAKE_CXX_COMPILER}<br>
- ARGS ${ARM_ARGS} ${ASM_FLAGS} -c ${ASM_SRC} -o ${ASM}.${SUFFIX}<br>
+ ARGS ${ARM_ARGS} ${ARM64_ARCH_ARGS} ${ASM_FLAGS} -c ${ASM_SRC} -o ${ASM}.${SUFFIX}<br>
DEPENDS ${ASM_SRC})<br>
endforeach()<br>
if(CPU_HAS_SVE2)<br>
@@ -703,7 +707,7 @@ if((MSVC_IDE OR XCODE OR GCC) AND ENABLE_ASSEMBLY)<br>
add_custom_command(<br>
OUTPUT ${ASM}.${SUFFIX}<br>
COMMAND ${CMAKE_CXX_COMPILER}<br>
- ARGS ${ARM_ARGS} ${ASM_FLAGS} -c ${ASM_SRC} -o ${ASM}.${SUFFIX}<br>
+ ARGS ${ARM_ARGS} ${ARM64_ARCH_ARGS} ${ASM_FLAGS} -c ${ASM_SRC} -o ${ASM}.${SUFFIX}<br>
DEPENDS ${ASM_SRC})<br>
endforeach()<br>
endif()<br>
@@ -715,7 +719,7 @@ if((MSVC_IDE OR XCODE OR GCC) AND ENABLE_ASSEMBLY)<br>
add_custom_command(<br>
OUTPUT ${ASM}.${SUFFIX}<br>
COMMAND ${CMAKE_CXX_COMPILER}<br>
- ARGS ${ARM_ARGS} ${ASM_FLAGS} -c ${ASM_SRC} -o ${ASM}.${SUFFIX}<br>
+ ARGS ${ARM_ARGS} ${ARM64_ARCH_ARGS} ${ASM_FLAGS} -c ${ASM_SRC} -o ${ASM}.${SUFFIX}<br>
DEPENDS ${ASM_SRC})<br>
endforeach()<br>
endif()<br>
@@ -727,7 +731,7 @@ if((MSVC_IDE OR XCODE OR GCC) AND ENABLE_ASSEMBLY)<br>
add_custom_command(<br>
OUTPUT ${ASM}.${SUFFIX}<br>
COMMAND ${CMAKE_CXX_COMPILER}<br>
- ARGS ${ARM_ARGS} ${ASM_FLAGS} -c ${ASM_SRC} -o ${ASM}.${SUFFIX}<br>
+ ARGS ${ARM_ARGS} ${ARM64_ARCH_ARGS} ${ASM_FLAGS} -c ${ASM_SRC} -o ${ASM}.${SUFFIX}<br>
DEPENDS ${ASM_SRC})<br>
endforeach()<br>
endif()<br>
diff --git a/source/common/CMakeLists.txt b/source/common/CMakeLists.txt<br>
index dc4a74107..33025cada 100644<br>
--- a/source/common/CMakeLists.txt<br>
+++ b/source/common/CMakeLists.txt<br>
@@ -123,29 +123,34 @@ if(ENABLE_ASSEMBLY AND (ARM64 OR CROSS_COMPILE_ARM64))<br>
set(ARM_ASMS_NEON_DOTPROD "${A_SRCS_NEON_DOTPROD}" CACHE INTERNAL "Arm Assembly Sources that use the Neon DotProd extension")<br>
foreach(SRC ${C_SRCS_NEON})<br>
set(ASM_PRIMITIVES ${ASM_PRIMITIVES} aarch64/${SRC})<br>
+ set_source_files_properties( ${SRC} PROPERTIES COMPILE_FLAGS ${ARM64_ARCH_ARGS} )<br>
endforeach()<br>
<br>
if(CPU_HAS_NEON_I8MM)<br>
foreach(SRC ${C_SRCS_NEON_I8MM})<br>
set(ASM_PRIMITIVES ${ASM_PRIMITIVES} aarch64/${SRC})<br>
+ set_source_files_properties( aarch64/${SRC} PROPERTIES COMPILE_FLAGS ${ARM64_ARCH_ARGS} )<br>
endforeach()<br>
endif()<br>
<br>
if(CPU_HAS_NEON_DOTPROD)<br>
foreach(SRC ${C_SRCS_NEON_DOTPROD})<br>
set(ASM_PRIMITIVES ${ASM_PRIMITIVES} aarch64/${SRC})<br>
+ set_source_files_properties( aarch64/${SRC} PROPERTIES COMPILE_FLAGS ${ARM64_ARCH_ARGS} )<br>
endforeach()<br>
endif()<br>
<br>
if(CPU_HAS_SVE AND HAVE_SVE_BRIDGE)<br>
foreach(SRC ${C_SRCS_SVE})<br>
set(ASM_PRIMITIVES ${ASM_PRIMITIVES} aarch64/${SRC})<br>
+ set_source_files_properties( aarch64/${SRC} PROPERTIES COMPILE_FLAGS ${ARM64_ARCH_ARGS} )<br>
endforeach()<br>
endif()<br>
<br>
if(CPU_HAS_SVE2 AND HAVE_SVE_BRIDGE)<br>
foreach(SRC ${C_SRCS_SVE2})<br>
set(ASM_PRIMITIVES ${ASM_PRIMITIVES} aarch64/${SRC})<br>
+ set_source_files_properties( aarch64/${SRC} PROPERTIES COMPILE_FLAGS ${ARM64_ARCH_ARGS} )<br>
endforeach()<br>
endif()<br>
<br>
diff --git a/source/common/cpu.cpp b/source/common/cpu.cpp<br>
index 61cdaadfb..24c60ff0e 100644<br>
--- a/source/common/cpu.cpp<br>
+++ b/source/common/cpu.cpp<br>
@@ -391,6 +391,8 @@ uint32_t cpu_detect(bool benableavx512)<br>
<br>
#elif X265_ARCH_ARM64<br>
<br>
+// TODO: Support ARM on Windows<br>
+#if _MSC_VER<br>
uint32_t cpu_detect(bool benableavx512)<br>
{<br>
int flags = 0;<br>
@@ -413,6 +415,37 @@ uint32_t cpu_detect(bool benableavx512)<br>
<br>
return flags;<br>
}<br>
+#else // Linux+Aarch64<br>
+<br>
+#include <asm/hwcap.h><br>
+#include <sys/auxv.h><br>
+<br>
+uint32_t cpu_detect(bool benableavx512)<br>
+{<br>
+ unsigned long hwcaps = getauxval(AT_HWCAP);<br>
+ unsigned long hwcaps2 = getauxval(AT_HWCAP2);<br>
+<br>
+ int flags = 0;<br>
+<br>
+ #if HAVE_NEON<br>
+ flags |= X265_CPU_NEON; // All of ARM64 has NEON<br>
+ #endif<br>
+ #if HAVE_NEON_DOTPROD<br>
+ flags |= (hwcaps & HWCAP_ASIMDDP ? X265_CPU_NEON_DOTPROD : 0);<br>
+ #endif<br>
+ #if HAVE_NEON_I8MM<br>
+ flags |= (hwcaps2 & HWCAP2_SVEI8MM ? X265_CPU_NEON_I8MM : 0);<br>
+ #endif<br>
+ #if HAVE_SVE<br>
+ flags |= (hwcaps & HWCAP_SVE ? X265_CPU_SVE : 0);<br>
+ #endif<br>
+ #if HAVE_SVE2<br>
+ flags |= (hwcaps2 & HWCAP2_SVE2 ? X265_CPU_SVE2 : 0);<br>
+ #endif<br>
+<br>
+ return flags;<br>
+}<br>
+#endif // end of Linux+AArch64<br>
<br>
#elif X265_ARCH_POWER8<br>
<br>
-- <br>
2.43.0.windows.1<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal"><span class="gmailsignatureprefix">-- </span><o:p></o:p></p>
<div>
<div>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" style="padding:0cm 7.5pt 0cm 0cm">
<div>
<p class="MsoNormal" align="center" style="text-align:center"><u><span style="font-size:13.5pt;font-family:"Times New Roman",serif;color:black"><a href="https://multicorewareinc.com/" target="_blank"><span style="color:black"><span style="color:#1155CC;border:solid windowtext 1.0pt;padding:0cm;text-decoration:none"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1031" src="cid:~WRD0000.jpg" alt="Image removed by sender."></span></span></a></span></u><span style="font-size:13.5pt;font-family:"Times New Roman",serif;color:black"><o:p></o:p></span></p>
</div>
<div align="center">
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" style="padding:0cm 7.5pt 0cm 0cm">
<p class="MsoNormal" align="center" style="text-align:center"> <a href="https://www.linkedin.com/company/multicoreware-inc/" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:#1155CC;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1030" src="cid:~WRD0000.jpg" alt="Image removed by sender."></span></span></a> <a href="https://twitter.com/MulticoreWare" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:#1155CC;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1029" src="cid:~WRD0000.jpg" alt="Image removed by sender."></span></span></a> <a href="https://www.facebook.com/multicoreware" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:#1155CC;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1028" src="cid:~WRD0000.jpg" alt="Image removed by sender."></span></span></a> <a href="https://www.youtube.com/channel/UCXZ1A1MzS5JwBqwBkNfsBBw?sub_confirmation=1" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:#1155CC;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1027" src="cid:~WRD0000.jpg" alt="Image removed by sender."></span></span></a> <a href="https://www.instagram.com/multicoreware.inc/" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:#1155CC;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1026" src="cid:~WRD0000.jpg" alt="Image removed by sender."></span></span></a><o:p></o:p></p>
</td>
</tr>
</tbody>
</table>
</div>
</td>
<td width="1" rowspan="2" style="width:.75pt;background:#999999;padding:0cm 0cm 0cm 0cm">
</td>
<td valign="top" style="padding:0cm 0cm 0cm 7.5pt">
<p style="margin:0cm;line-height:15.0pt"><b><span style="font-family:"Arial",sans-serif;color:#444444">Dash Santosh</span></b><span style="font-size:13.5pt;font-family:"Times New Roman",serif;color:black"><o:p></o:p></span></p>
<p style="mso-margin-top-alt:0cm;margin-right:0cm;margin-bottom:3.75pt;margin-left:0cm;line-height:15.0pt">
<b><span style="font-size:10.0pt;font-family:"Arial",sans-serif;color:#666666">Research Engineer, Video Engineering</span></b><span style="font-size:13.5pt;font-family:"Times New Roman",serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm;line-height:12.0pt"><span style="font-size:10.0pt;font-family:"Arial",sans-serif;color:#585858">Mobile: +91 78679 43737</span><span style="font-size:13.5pt;font-family:"Times New Roman",serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm;line-height:12.0pt"><span style="font-size:7.5pt;font-family:"Arial",sans-serif;color:#585858">IndiQube Echo Point, Avinashi Road</span><span style="font-size:13.5pt;font-family:"Times New Roman",serif;color:black"><o:p></o:p></span></p>
<p style="margin:0cm;line-height:12.0pt"><span style="font-size:10.0pt;font-family:"Arial",sans-serif;color:#585858">Coimbatore - 641 014</span><span style="font-size:13.5pt;font-family:"Times New Roman",serif;color:black"><o:p></o:p></span></p>
</td>
</tr>
<tr>
<td valign="top" style="padding:0cm 7.5pt 0cm 0cm"></td>
<td valign="top" style="padding:0cm 0cm 0cm 7.5pt">
<p class="MsoNormal"><span style="font-size:13.5pt;font-family:"Times New Roman",serif;color:black;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1025" src="cid:~WRD0000.jpg" alt="Image removed by sender."></span><span style="font-size:13.5pt;font-family:"Times New Roman",serif;color:black"><o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>