<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[GSoC&#39;18 with STE||AR GROUP - Medium]]></title>
        <description><![CDATA[My experiences with working on HPX - Medium]]></description>
        <link>https://medium.com/gsoc18-with-ste-ar-group?source=rss----d3f88b9804d6---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>GSoC&amp;#39;18 with STE||AR GROUP - Medium</title>
            <link>https://medium.com/gsoc18-with-ste-ar-group?source=rss----d3f88b9804d6---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 23 May 2026 16:26:22 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/gsoc18-with-ste-ar-group" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Pre Mid term evaluation status]]></title>
            <link>https://medium.com/gsoc18-with-ste-ar-group/pre-mid-term-evaluation-status-581e650f723c?source=rss----d3f88b9804d6---4</link>
            <guid isPermaLink="false">https://medium.com/p/581e650f723c</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[cpp]]></category>
            <category><![CDATA[gsoc]]></category>
            <category><![CDATA[hpx]]></category>
            <dc:creator><![CDATA[Nikunj Gupta]]></dc:creator>
            <pubDate>Sat, 07 Jul 2018 04:41:04 GMT</pubDate>
            <atom:updated>2018-07-07T04:41:04.176Z</atom:updated>
            <content:encoded><![CDATA[<p>In my last blog, I was still trying to make things happen in Linux with no clue about Mac OS X implementation and failed attempt at Microsoft’s MSVC as well. Things have changed a lot since then. With this blog, I’ll continue from I left off.</p><h3>Linux Implementation</h3><p>From my previous researches and tries at attempting to run <em>main() </em>on HPX thread, I now finally implemented it and it has been successfully integrated in HPX as well. The implementation consists of using Linker flag <strong><em>-Wl,-wrap</em></strong> to wrap <em>__libc_start_main</em> and change the program’s entry point. More on this can be read in my previous blogs.</p><h3>Mac OSX Implementation</h3><p>After taking care of my Linux implementation, I went ahead to look for ways to implement the same in Mac OSX. We need to first understand why my Linux implementation is not portable enough that we need to implement it differently for different OSes.</p><ul><li>Every OS has its own Linker with different Linker Flags. The <em>-wrap</em> linker flag is not available in both Windows and Mac OSX.</li><li>Mac OSX uses its own version of <em>libc</em> and <em>__libc_start_main</em> is a <em>libc</em> function provided by <em>glibc</em>. Therefore Mac OSX does not contain that very same function to try to hook to.</li></ul><p>This called for an alternate way of changing the entry point of the program. That’s when I stumbled upon <em>-e</em> linker flag. This changes the entry point of program to user defined entry point as opposed to <em>main()</em>. While this flag was available in Linux as well, it served no good use as it changed the entry point of the ELF from <em>_start</em> to that of the user defined entry point. This would have meant that I had to implement _start first and then create the function stack altogether. Clearly <em>-wrap</em> provided me with better alternatives.</p><p>Things will get clearer with the following example:</p><p>Create a file (let’s call it <em>link.cpp</em>) and copy the following code:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/04dfda36a451c326207d82b46cf60bad/href">https://medium.com/media/04dfda36a451c326207d82b46cf60bad/href</a></iframe><p>Now let’s create another file (let’s call it <em>main.cpp</em>) which will contain our main function.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/747c263b30c39c68d1ce6cc94521f152/href">https://medium.com/media/747c263b30c39c68d1ce6cc94521f152/href</a></iframe><p>Now open up the terminal and write the following commands:</p><pre>$ clang++ -c -o link.cpp.o link.cpp<br>$ clang++ -c -o main.cpp.o main.cpp<br>$ clang++ -Wl,-e,_before_main -o result link.cpp.o main.cpp.o</pre><p>From the above commands we can see the use of <em>-e</em> linker flag. Running the generated executable should give the following output:</p><pre>$ ./result<br>before_main<br>main</pre><p>It is quite clear from the above output that the entry point has been changed from <em>main</em> to <em>before_main</em>. I have used this method to implement all the initializations necessary for initiating the HPX runtime.</p><p>I was able to successfully implement it and is currently undergoing review by my mentors.</p><p>Let’s now shift gears to Window’s end.</p><h3>MSVC Implementation</h3><p>After failing to achieve expected output with MSVC, my mentor got me in contact with MSVC team. I shared my doubts and sought out ways to implement them.</p><p>Unfortunately, MSVC does not provide any elegant way of initializing the HPX runtime system. After exchanging a few emails, we came down to 2 ways of implementing it.</p><h4>First Method</h4><p>Re-implementing the <em>mainCRTStartup</em> which is the entry point of an <em>exe</em> file. Implementing the function in a separate file any compiling it to an <em>obj</em> file and further linking it at link time will make sure that my implementation of <em>mainCRTStartup </em>is run as opposed to MSVC’s implementation.</p><p>While this method will make for an elegant solution, there are some serious maintenance issues that needs to be resolved. Firstly, there is a question of portability amongst different architecture. There is a need to re-write code specific to every architecture. Secondly, the code for the function changes quite often. This would mean that I will have to keep the multiple implementation of the function for different versions of MSVC Compiler.</p><p>I’m currently trying to explore this method in depth to understand its feasibility.</p><h4>Second Method</h4><p>It involves using <em>#pragm</em>a <em>init_seg</em>. It can allow users to inject code at various steps of the program. While this looks lucrative at first glance, we cannot force it to run after all the user defined global objects have been constructed. We can run, however, run before it.</p><p>While running it before all the global objects using <em>hpx_start</em> will register the kernel thread with HPX thread, I would still not be able to use all the functionality that it provides. With that said, one could always use <em>run_on_hpx_thread()</em> since global objects and <em>main</em> are registered with the HPX runtime system (but are not running on it!). This method is similar to the one provided in <a href="https://github.com/STEllAR-GROUP/hpx/blob/master/examples/quickstart/init_globally.cpp">init_globally</a> example.</p><p>I’m exploring this method in depth as well.</p><h3>What next?</h3><p>While implementing for Linux and Mac OSX, I came up with an idea of having a custom <em>init</em> function for the HPX library. If you’re not familiar with the purpose of <em>init</em> function, then in short, it is responsible for initializing the <strong>.init_array</strong> section and also calling the constructors of global objects. Basically, it deals with all the initializations relating to global scope variables and objects. If we implement an <em>init</em> function for HPX then we could deal with certain global scope initializations and run them on HPX thread as well.</p><p>That’s what I’ll be focusing on in the future along with MSVC implementation.</p><blockquote>Until next time, I bid you farewell!</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=581e650f723c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gsoc18-with-ste-ar-group/pre-mid-term-evaluation-status-581e650f723c">Pre Mid term evaluation status</a> was originally published in <a href="https://medium.com/gsoc18-with-ste-ar-group">GSoC&#39;18 with STE||AR GROUP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Week 4 & 5 status]]></title>
            <link>https://medium.com/gsoc18-with-ste-ar-group/week-4-5-status-be9887a2ee22?source=rss----d3f88b9804d6---4</link>
            <guid isPermaLink="false">https://medium.com/p/be9887a2ee22</guid>
            <category><![CDATA[gsoc]]></category>
            <category><![CDATA[hpx]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[hooking]]></category>
            <dc:creator><![CDATA[Nikunj Gupta]]></dc:creator>
            <pubDate>Wed, 20 Jun 2018 14:30:52 GMT</pubDate>
            <atom:updated>2018-06-20T14:27:29.345Z</atom:updated>
            <content:encoded><![CDATA[<p>Since, I could not achieve success with Windows based system, I switched back to Linux/Unix. This time I addressed the drawbacks of my previous implementation.</p><h3>First Drawback:</h3><p>My previous implementation worked only for a <em>dynamically linked executable. </em>This meant that the executable would result in a <strong><em>segmentation fault </em></strong>in case the user tried to link it statically.</p><p>Therefore, I had to address the same with either another implementation (a ground’s up approach) or updating the my current implementation. The use of <strong><em>dlfcn </em></strong><em>library </em>meant that I could not update it any further, so I continued on finding another solution. This is when I stumbled upon the <strong>-Wl,-wrap </strong>method of wrapping functions. This method worked with <em>statically and dynamically linked executable. </em>Thus, this was an apt replacement of my current implementation.</p><p>An example of <strong>-Wl,-wrap</strong> with wrapping <strong><em>__libc_start_main</em></strong> to change the entry point is given as follows:</p><p><strong>Step 1: </strong>Create a file named wrap_libc.cpp with the following code in it:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2b446205a7c5e2570a68283156bd5db5/href">https://medium.com/media/2b446205a7c5e2570a68283156bd5db5/href</a></iframe><p>With the <strong>-Wl,-wrap </strong>method, you need to prepend <strong><em>__wrap_ </em></strong>with the function name (so <strong><em>__libc_start_main </em></strong>converts to <strong><em>__wrap___libc_start_main)</em></strong>.</p><p><strong>Step 2: </strong>Compile the code to create an object file to link to another file. In your terminal type:</p><pre><strong>$ g++ -c -o wrap_libc.o wrap_libc.cpp</strong></pre><p>This should create an object file by the name of <em>wrap_libc.o</em> which you can later link with.</p><p><strong>Step 3:</strong> It is now time to create a test file:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7d04a435d1bed1e3205fe2d839d0a0d8/href">https://medium.com/media/7d04a435d1bed1e3205fe2d839d0a0d8/href</a></iframe><p><strong>Step 4: </strong>Open up the terminal and type:</p><pre><strong>$ g++ -static test.cpp wrap_libc.o -o static_working_file</strong></pre><p>This should result in the creation of a <em>statically linked executable.</em> Run it to check if you get the expected output:</p><pre><strong>$ ./static_working_file</strong></pre><pre>This is our Custom Entry point</pre><pre>main</pre><p>If your output matches the above output, things have worked out. And so now, we can address the second drawback.</p><h3>Second Drawback</h3><p>Now that I had made things working for <em>statically linked executable</em>, I had to handle another major drawback. The <strong>HPX Runtime</strong> system initializes it from the custom implemented Entry Point. This would mean, that any global scope initialization using HPX functionality will result in a<strong><em> segmentation fault</em></strong>.</p><p>This needed further investigation, which leads to another <strong>libc</strong> function known as <strong><em>__libc_csu_init</em></strong> which carries on the global scope initializations. So wrapping this function to initialize the runtime system should help (or result in what is known as <strong>Initialization Sequencing Fiasco</strong>). I’m currently working on testing this method. A simple implementation can be seen <a href="https://github.com/NK-Nikunj/GSoC-experimental-codes/tree/master/hpx_code/dl_wrap">here</a> (<strong>needs HPX installed</strong>). You will need to run the makefile to generate the executable.</p><p>My current goals are to test this implementation thoroughly before integrating it with the source code (Since it will require a lot of changes in the cmake structure). I will then switch back to Windows to complete the project.</p><blockquote>Until next week, I bid you farewell</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=be9887a2ee22" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gsoc18-with-ste-ar-group/week-4-5-status-be9887a2ee22">Week 4 &amp; 5 status</a> was originally published in <a href="https://medium.com/gsoc18-with-ste-ar-group">GSoC&#39;18 with STE||AR GROUP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Week 2, 3 status]]></title>
            <link>https://medium.com/gsoc18-with-ste-ar-group/week-2-3-status-15f8288eeeda?source=rss----d3f88b9804d6---4</link>
            <guid isPermaLink="false">https://medium.com/p/15f8288eeeda</guid>
            <category><![CDATA[runtime]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[cplusplus]]></category>
            <category><![CDATA[gsoc]]></category>
            <category><![CDATA[hpx]]></category>
            <dc:creator><![CDATA[Nikunj Gupta]]></dc:creator>
            <pubDate>Mon, 04 Jun 2018 21:51:15 GMT</pubDate>
            <atom:updated>2018-06-04T21:51:14.658Z</atom:updated>
            <content:encoded><![CDATA[<p>Last to last week I was able to produce working results and successfully ran HPX functionality directly from <em>int main. </em>With this work done, I had two main tasks at hand. First was to integrate my experimental code into HPX and the second was to produce working results for MSVC.</p><p>While I was successfully able to integrate my code into HPX (see <a href="https://github.com/STEllAR-GROUP/hpx/pull/3338">the pull request</a>), I am still working on producing working results for MSVC. I spent the week 2 understanding the MSVC runtime system and various methods to hook into runtime functions. I succeeded in hooking into a few runtime functions, but could not seem to hook into <em>mainCRTStartup </em>which is responsible to initialize the C runtime system in MSVC. After clearing doubts with my mentor, I decided to leave this section as of now and work on a different case scenario for gcc, clang based compilers.</p><p>As of now, my implementation will work perfectly for any function call from C main function. But, it would not work with global scope object or any section based function (formed using the “<em>__attribute__ ((“section_name”))”</em>). This would simply result in a runtime failure.</p><p>A very simple example of the same is given as:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5f301c42f00146e5acdf957156baa63c/href">https://medium.com/media/5f301c42f00146e5acdf957156baa63c/href</a></iframe><p>The above code will break the HPX runtime system, throwing a <em>null id exception, asking</em> if the code actually ran on an HPX thread (which it did not since the runtime system was yet to initialize).</p><p>I am currently figuring out ways to make HPX functionality work for global scope objects. This will be my prime focus for this week and I will attempt to implement the same.</p><blockquote>Until then, I bid you farewell!</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=15f8288eeeda" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gsoc18-with-ste-ar-group/week-2-3-status-15f8288eeeda">Week 2, 3 status</a> was originally published in <a href="https://medium.com/gsoc18-with-ste-ar-group">GSoC&#39;18 with STE||AR GROUP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Week 1 Status]]></title>
            <link>https://medium.com/gsoc18-with-ste-ar-group/week-1-status-7d39fc515b2?source=rss----d3f88b9804d6---4</link>
            <guid isPermaLink="false">https://medium.com/p/7d39fc515b2</guid>
            <category><![CDATA[cplusplus]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[hpx]]></category>
            <category><![CDATA[hooking]]></category>
            <category><![CDATA[gsoc]]></category>
            <dc:creator><![CDATA[Nikunj Gupta]]></dc:creator>
            <pubDate>Mon, 21 May 2018 01:08:19 GMT</pubDate>
            <atom:updated>2018-05-21T01:08:18.690Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8L5GXpA1P0xdsWAg0ica3Q.png" /><figcaption>Working code output on Ubuntu 18.04 LTS</figcaption></figure><p>After the Community Bonding period ended, the Coding period kicked off and with full zeal and enthusiasm, I started to write code that could run HPX functionality on Compiler’s main itself (if you didn’t get the reference, <a href="https://medium.com/gsoc18-with-ste-ar-group/gsoc18-with-ste-ar-group-54ab226afe80">read this</a>).</p><p>I focused on Linux and Unix based systems first. My motive was to somehow run HPX functionality directly from Compiler’s main, but that would mean that the HPX system somehow needs to get initialized before it. And so my journey began to find out ways to make this happen (this dates back to March when I was writing my proposal) and I stumbled upon a solution that involved hooking. To start off with, hooking can be described as: (as per given in <a href="https://en.wikipedia.org/wiki/Hooking">Wikipedia</a>)</p><blockquote>A range of techniques used to alter or augment the behavior of an operating system, of applications, or of other software components by intercepting function calls or messages or events passed between software components.</blockquote><p>So with a clear picture of what a <strong>hook</strong> is, let’s move on to the function I decided to hook into to intercept the function call to alter (or override the function) the behavior, a <strong><em>libc </em></strong>function <strong><em>__libc_start_main</em></strong>. The work of <strong><em>__libc_start_main</em></strong> is to initialize the process, call the main with appropriate arguments, and then handle the return from main. The next thing would be to understand how to create a hook. The usual method to employ a hook is by using the <strong>dlfcn.h </strong>header which provides a programming interface to dynamic loader.</p><p>A clear picture of what I’ve written above can be established by explaining the following code snippet:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d75df1de4410fea9d00d5f29ac8020f8/href">https://medium.com/media/d75df1de4410fea9d00d5f29ac8020f8/href</a></iframe><p>Starting from line 2, we see a classic definition of the <strong><em>__libc_start_main </em></strong>function. Next from line 13 to 26 we see a rather complex code. To break it into simpler chunks, what we want to do is to load this function with the dynamic linker instead of the actual function. This can be done using <strong>dlsym() </strong>(provided in the <strong>dlfcn.h</strong> header) function which takes two parameters <strong>handler </strong>and<strong> function name</strong>. For handler we use <strong>RTLD_NEXT</strong> which returns the <strong>next object</strong> after the actual one that defines <strong><em>__libc_start_main</em></strong> and store it in a pointer <strong>real_start_main </strong>and we use <strong><em>__libc_start_main</em></strong> as the function_name.</p><p>The pointer <strong>real_start_main</strong> now contains info to initialize the process, call the main function with appropriate arguments, and handle return from main. So if we were to return <strong>real_start_main</strong> from the defined function, the code will function exactly the same as pre-implemented <strong><em>__libc_start_main</em></strong><em>. </em>One thing to note here is that this pointer contains the Compiler’s main function itself. So, if we were to switch this function with our own implementation of main (like <strong>initializing_main</strong> in the code snippet) then our pointer would call that function instead, and that too with appropriate arguments! This would mean that the new entry point of the program will now change from Compiler’s main to our implementation of main.</p><p>With that said, if the entry point of our system changes to our own implementation, then we could simply initiate the HPX system and call the main function from there. This would mean that for Linux and Unix based system this implementation would suffice!</p><p>With this work done, I’m now shifting to <strong>Windows</strong> implementation and it will therefore be my focus for the next week i.e. week 2.</p><blockquote>Until then, I bid you farewell!</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7d39fc515b2" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gsoc18-with-ste-ar-group/week-1-status-7d39fc515b2">Week 1 Status</a> was originally published in <a href="https://medium.com/gsoc18-with-ste-ar-group">GSoC&#39;18 with STE||AR GROUP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GSoC’18 with STE||AR GROUP]]></title>
            <link>https://medium.com/gsoc18-with-ste-ar-group/gsoc18-with-ste-ar-group-54ab226afe80?source=rss----d3f88b9804d6---4</link>
            <guid isPermaLink="false">https://medium.com/p/54ab226afe80</guid>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[gsoc18]]></category>
            <category><![CDATA[cplusplus]]></category>
            <category><![CDATA[hpx]]></category>
            <dc:creator><![CDATA[Nikunj Gupta]]></dc:creator>
            <pubDate>Sat, 12 May 2018 13:42:45 GMT</pubDate>
            <atom:updated>2018-05-12T13:43:01.933Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0xg0oFpXE0oXhH9zAW1WKQ.png" /><figcaption>Acceptance mail from GSoC’18 team</figcaption></figure><blockquote>Hello World!</blockquote><p>This year I got selected into the Google Summer of Code Program with <strong>STE||AR GROUP</strong>. My <a href="https://summerofcode.withgoogle.com/projects/#5539909977243648">project</a> requires me to investigate ways to start the <a href="https://github.com/stellAR-GROUP/hpx/">HPX</a> run time system with the compiler’s version of main (i.e<strong> <em>int main</em></strong>).</p><p>This is first of the many blogs that I aspire to write. With the advent of Community Bonding Period, I was overwhelmed with the work. I had my End Term Examinations from 25th April to 3rd May, due to which I was a little inactive on IRC. After 3rd May, I gained momentum and started working on my Project with full enthusiasm. I made contact with my fellow GSoCers and also attended a Skype meet with my mentors. In this meet we discussed about the possible implementation of my project and the potential fall backs for the same.</p><h3><strong>An Overview of my Project</strong></h3><p>Currently the HPX functionalities can be invoked only after initiating the HPX run time environment. This can be done in one of three ways:</p><ul><li>Re-using the <strong><em>main()</em></strong> function as the main HPX entry point</li><li>Supplying our own main HPX entry point while blocking the main thread</li><li>Supplying our own main HPX entry point while avoiding to block the main thread</li></ul><p>For further details on their implementation, <a href="https://stellar-group.github.io/hpx/docs/html/hpx.html#hpx.manual.applications">click here</a>.</p><p>Seamless integration in the first way of implementation can be done using:</p><pre>#define main hpx_startup::user_main</pre><p>The above macro could however result in an unexpected behavior. This is where my GSoC project comes in. My project is to seamlessly integrate the HPX run time system such that any user can use any of the HPX functions directly from <em>Compiler’s main</em> than to explicitly call functions to initiate the run time system.</p><h3><strong>What I’ve done so far</strong></h3><p>After the discussion with my mentor, I created a repository by the name of <a href="https://github.com/NK-Nikunj/GSoC-experimental-codes">GSoC-experimental-code</a>. This repository contains my experimental code that is essential to make my GSoC project a success. I will also create a repository for study material/notes.</p><h3><strong>What Next</strong></h3><p>In the next few days to come I will try to integrate my experimental code with HPX. I will also continue to learn more about hooking.</p><blockquote>With this I bid Good-Bye!</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=54ab226afe80" width="1" height="1" alt=""><hr><p><a href="https://medium.com/gsoc18-with-ste-ar-group/gsoc18-with-ste-ar-group-54ab226afe80">GSoC’18 with STE||AR GROUP</a> was originally published in <a href="https://medium.com/gsoc18-with-ste-ar-group">GSoC&#39;18 with STE||AR GROUP</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>