<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[A5/OSX] al_load_bitmap_f refuses to load .bmp</title>
		<link>http://www.allegro.cc/forums/view/605875</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 22 Dec 2010 14:24:17 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The title says it all. I have a chunk of memory that is an exact copy of a .bmp file from disk. I have a file interface that reads from memory as appropriate. This interface does load this .bmp correctly on Windows. This file interface also loads .pcx files correctly on both Windows and OSX. It does not load .bmp on OSX, just returning NULL and leaving nothing in Allegro&#39;s errno, which means I have no indication what is wrong.</p><p>Suggestions? This is kinda urgent.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Tue, 21 Dec 2010 20:51:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Check whether the .bmp is loaded by the native image loader or using Allegro&#39;s loader (the log file should tell you what formats the native image loader is taking care of). If it is the native loader, try disabling it (which means you don&#39;t get .png or .jpg support without libpng and libjpg).<br />You may want to do the same on Windows.</p><p>Allegro has a bmp loader (addons/image/bmp.c), but Windows and OS X both have native loaders as well that use OS calls. The problem could be with any of these (are there bmp formats that Windows supports but Allegro&#39;s native loader and/or OS X does not?) and the first thing to do is to check which of them is actually being used.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Tue, 21 Dec 2010 21:05:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What log file? Where is this located? How do I disable the native loader?</p><p>EDIT: It is using the native loader. How do I disable it?</p><p>EDIT2: It works without hte native loader.</p><p>EDIT3: Similar problem with Ogg. This time errno is sometimes 12, sometimes 21. This has not been tested on Windows. What the <span class="cuss"><span>fuck</span></span> does &quot;12&quot; mean? The error codes aren&#39;t listed anywhere!</p><p>EDIT4: If it&#39;s just errno, then 12 = ENOMEM. Which makes no <span class="cuss"><span>fuck</span></span>ing sense! Help? What is even setting this, I&#39;m not seeing any calls to al_set_errno in acodec.</p><p>EDIT5: It&#39;s not even calling any of my file IO functions! I added logging to my custom fread(), and nothing is logged for the OGGs. What is going on here?</p><p>EDIT6: Forget it, something else was setting errno to 12. It doesn&#39;t touch errno at all. But it sitll doesn&#39;t call any of my I/O functions!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Tue, 21 Dec 2010 22:09:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>How about increasing the MaxDsiz kernel parameter to 64?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Dizzy Egg)</author>
		<pubDate>Tue, 21 Dec 2010 22:37:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895769#target">Dizzy Egg</a> said:</div><div class="quote"><p>How about increasing the MaxDsiz kernel parameter to 64?</p></div></div><p>
I don&#39;t know what that is or why it is relevant. Also see EDIT6. ENOMEM is a red herring.</p><p>As far as I can tell now it&#39;s just stubbornly refusing to load. Yes, I compiled with Vorbis. But it&#39;s calling none of my IO stuff, it just returns NULL.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Tue, 21 Dec 2010 22:40:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>X-G, some of the loaders use fseek(0) (etc) and are not sequential. Are you trying to load a data chunk that doesn&#39;t start at position 0 within a file? If so, you have two options:</p><ol><li><p>Read the entire sub chunk into memory first, then call memopen on it, then load it.
</p></li><li><p>Ask for my file slice code, which sits on top of any custom file interface and resets the seeking boundaries.</p></li></ol><p>That wouldn&#39;t explain why your interface isn&#39;t being touched though...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Tue, 21 Dec 2010 22:42:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895771#target">Matthew Leverton</a> said:</div><div class="quote"><p>some of the loaders use fseek(0) (etc) and are not sequential. Are you trying to load a data chunk that doesn&#39;t start at position 0 within a file</p></div></div><p>

It is not reading directly from a file at all. This is from a chunk of (encrypted) memory through a set of I/O hooks I wrote myself that do automatic decryption. But my I/O functions aren&#39;t getting called at all. I know the functions work otherwise, because they are used for BMP loading which, at this point, works just fine. Seeking etc. works fine in all directions. But my fseek doesn&#39;t called, or any other f* functions of mine.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Tue, 21 Dec 2010 22:44:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I haven&#39;t looked at the OS X code... is it even programmed to run the native file loaders through the custom file interface? Of course, this wouldn&#39;t apply to the OGG file.</p><p>I wrote the native GDI+ for Windows, and I know that one uses custom interfaces.</p><p>I would check that the <span class="source-code">fp-&gt;vtable</span> (or something like that) is actually set to the proper interface. If so, then it would seem to be a bug with Allegro if none of your read or seek functions are called.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Tue, 21 Dec 2010 22:50:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895774#target">Matthew Leverton</a> said:</div><div class="quote"><p>I would check that the fp-&gt;vtable (or something like that) is actually set to the proper interface. </p></div></div><p>
It is. I create the file handle myself and do all the initialization manually, such as setting the vtable. The only NULL entries are for fopen, fclose and fwrite. And, as I said, it works for the BMP loader. I don&#39;t think there is a native OGG interface for OSX... is there? It definitely wanted to link with libvorbis and libogg.</p><p>The code I use is simple:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a><span class="k3">*</span> wrapDaxBlock<span class="k2">(</span><span class="k1">const</span> <span class="k1">unsigned</span> <span class="k1">char</span><span class="k3">*</span> pMemory, <span class="k1">size_t</span> uiSize<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>    DAX_FILE<span class="k3">*</span> fp <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>DAX_FILE<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span>fp, <span class="n">0</span>, <span class="k1">sizeof</span><span class="k2">(</span>DAX_FILE<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>    fp-&gt;al.vtable <span class="k3">=</span> <span class="k3">&amp;</span>gDaxVTable<span class="k2">;</span>
<span class="number">  6</span>    fp-&gt;pMemory <span class="k3">=</span> pMemory<span class="k2">;</span>
<span class="number">  7</span>    fp-&gt;uiMemorySize <span class="k3">=</span> uiSize<span class="k2">;</span>
<span class="number">  8</span>    fp-&gt;uiCursor <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  9</span>    fp-&gt;uiIsEOF <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>    <span class="k1">return</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a><span class="k3">*</span><span class="k2">)</span>fp<span class="k2">;</span>
<span class="number"> 12</span><span class="k2">}</span>
<span class="number"> 13</span>
<span class="number"> 14</span>
<span class="number"> 15</span>...
<span class="number"> 16</span>
<span class="number"> 17</span>            <a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a><span class="k3">*</span> pDaxFile <span class="k3">=</span> wrapDaxBlock<span class="k2">(</span>pMemory, uiMemorySize<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>            <a href="http://www.allegro.cc/manual/ALLEGRO_SAMPLE"><span class="a">ALLEGRO_SAMPLE</span></a><span class="k3">*</span> pSample <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_sample_f"><span class="a">al_load_sample_f</span></a><span class="k2">(</span>pDaxFile, ext<span class="k2">)</span><span class="k2">;</span>
</div></div><p>

APPEND: The only other option I can think of is if it bails out before even attempting to do any I/O. How would I find out?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Tue, 21 Dec 2010 22:54:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895775#target">X-G</a> said:</div><div class="quote"><p>  I don&#39;t think there is a native OGG interface for OSX... is there?
</p></div></div><p>Not that I know of. Can you load an ogg file from a regular file using stdio? (Are you positive you&#39;ve initialized that addon, etc?)</p><p>Your code looks correct. Just an FYI: 5.1 / 5.0RC4 will be slightly different in how you initialize a custom interface, as it no longer requires access to the internals.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Tue, 21 Dec 2010 23:05:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895758#target">X-G</a> said:</div><div class="quote"><p>What log file? Where is this located? How do I disable the native loader?</p></div></div><p>
Sorry, my bad. I assumed you were using the debug version. I guess you found the options in the end, but just in case: you can set all of those from the cmake GUI.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>EDIT2: It works without hte native loader.</p></div></div><p>
Ok.<br />There is the following block of code in addons/image/macosx.m:
</p><div class="source-code snippet"><div class="inner"><pre>      <span class="c">/* Unload previous loader, if any */</span>
      <a href="http://www.allegro.cc/manual/al_register_bitmap_loader"><span class="a">al_register_bitmap_loader</span></a><span class="k2">(</span>s, NULL<span class="k2">)</span><span class="k2">;</span>
      <a href="http://www.allegro.cc/manual/al_register_bitmap_loader_f"><span class="a">al_register_bitmap_loader_f</span></a><span class="k2">(</span>s, NULL<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
Disable that and it should only use the native loader for formats it didn&#39;t previously understand (like png and jpg) and otherwise use the default loader. Which may actually be the preferred behaviour.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895774#target">Matthew Leverton</a> said:</div><div class="quote"><p>is it even programmed to run the native file loaders through the custom file interface?</p></div></div><p>
It should do; it uses al_fopen() and friends.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Tue, 21 Dec 2010 23:09:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895780#target">Matthew Leverton</a> said:</div><div class="quote"><p>Can you load an ogg file from a regular file using stdio?</p></div></div><p>
Quick and dirty test says no. Sigh. Here&#39;s what I do:</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_install_audio"><span class="a">al_install_audio</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_init_acodec_addon"><span class="a">al_init_acodec_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
  <span class="k2">{</span>
    <a href="http://www.allegro.cc/manual/al_reserve_samples"><span class="a">al_reserve_samples</span></a><span class="k2">(</span><span class="n">16</span><span class="k2">)</span><span class="k2">;</span>
    LOGWRITE<span class="k2">(</span><span class="s">"Sound OK"</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
  <span class="k2">}</span>
</pre></div></div><p>

It logs that and returns zero.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Tue, 21 Dec 2010 23:09:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895781#target">Evert</a> said:</div><div class="quote"><p>It should do; it uses al_fopen() and friends.</p></div></div><p>If you don&#39;t set the current file interface to your custom one, then it won&#39;t ever use it. Going on the only code posted, it seems X-G is making a plain wrapped memfile like interface, so it shouldn&#39;t be an issue.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 21 Dec 2010 23:13:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895782#target">X-G</a> said:</div><div class="quote"><p> Quick and dirty test says no
</p></div></div><p>I&#39;d check to make sure the ogg loader is being registered. It might show up in a debug log file. Otherwise, step-by-step debugging should tell you that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Tue, 21 Dec 2010 23:19:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Now I&#39;m confused and annoyed. To find out if OGG was being registered correctly, I added a call to ALLEGRO_INFO in acodec.c to see if it was being called. Built Allegro.</p><p>AND NOW LOADING <span class="cuss"><span>GODDAMN</span></span> WORKS. WHAT.</p><p>I still can&#39;t <i>hear</i> anything, but loading works. It calls my function and results in a sample being returned.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Tue, 21 Dec 2010 23:30:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Did you get anything figured out?</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/605875/895775#target">X-G</a> said:</div><div class="quote"><p> The only NULL entries are for fopen, fclose and fwrite. 
</p></div></div><p>By the way, I think <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a></span> is the only one that is allowed to be <span class="source-code">NULL</span>. The others will crash if somebody tries to use them, so they should at least have NOP stubs in your interface.</p><p>In 5.0RC3, your <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a></span> is responsible for freeing the file pointer. In future versions, it will instead be responsible for freeing the <span class="source-code">userdata</span> pointer (which will be pointing to your custom struct), while Allegro will free the file pointer itself.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Wed, 22 Dec 2010 04:22:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I didn&#39;t figure it out, it just suddenly started working for no reason. I didn&#39;t change any logic. And right now (as well as yesterday), my priorities are not on figuring out why it&#39;s behaving this way, but rather to just <i>get it working</i>.</p><p>Today&#39;s challenge: figure out why the audio isn&#39;t playing. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>Anyway, the way I&#39;m using this now, writing and closing the file should never occur. The load_*_f functions don&#39;t close the file, I manually construct the file, and they have no reason to write to the file, so I should be safe. Right?</p><p>I think we&#39;re about done for this thread. Thanks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Wed, 22 Dec 2010 13:40:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you don&#39;t call those functions, then it&#39;s okay. I suppose you are calling <span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a></span> directly on <span class="source-code">pDaxFile</span>, which will work up to 5.0RC3.</p><p>But the next release will clean things up a bit such that you don&#39;t need to access the internals. Each <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a></span> will contain a <span class="source-code">userdata</span> pointer. In your case, that will point to a <span class="source-code">DAX_FILE</span> (which no longer will contain the <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a></span> at the beginning).</p><p>So you&#39;ll need to call <span class="source-code"><a href="http://www.allegro.cc/manual/al_fclose"><span class="a">al_fclose</span></a><span class="k2">(</span><span class="k2">)</span></span> to free the userdata memory. Then Allegro will destroy the <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a><span class="k3">*</span></span> itself. </p><p>Something like:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a><span class="k3">*</span> wrapDaxBlock<span class="k2">(</span><span class="k1">const</span> <span class="k1">unsigned</span> <span class="k1">char</span><span class="k3">*</span> pMemory, <span class="k1">size_t</span> uiSize<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>    DAX_FILE<span class="k3">*</span> fp <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>DAX_FILE<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span>fp, <span class="n">0</span>, <span class="k1">sizeof</span><span class="k2">(</span>DAX_FILE<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span>    fp-&gt;pMemory <span class="k3">=</span> pMemory<span class="k2">;</span>
<span class="number">  6</span>    fp-&gt;uiMemorySize <span class="k3">=</span> uiSize<span class="k2">;</span>
<span class="number">  7</span>    fp-&gt;uiCursor <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  8</span>    fp-&gt;uiIsEOF <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>    <span class="k1">return</span> al_create_file_handle<span class="k2">(</span><span class="k3">&amp;</span>gDaxVTable, fp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span><span class="k2">}</span>
<span class="number"> 12</span>
<span class="number"> 13</span><span class="k1">void</span> closeDaxBlock<span class="k2">(</span><span class="k1">const</span> <a href="http://www.allegro.cc/manual/ALLEGRO_FILE"><span class="a">ALLEGRO_FILE</span></a> <span class="k3">*</span>f<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>al_get_file_userdata<span class="k2">(</span>f<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span><span class="k2">}</span>
<span class="number"> 16</span>
<span class="number"> 17</span>fp <span class="k3">=</span> wrapDaxBlock<span class="k2">(</span> ... <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>...
<span class="number"> 19</span><a href="http://www.allegro.cc/manual/al_fclose"><span class="a">al_fclose</span></a><span class="k2">(</span>fp<span class="k2">)</span><span class="k2">;</span>
</div></div><p>
Edit: fixed the <span class="source-code"><a href="http://www.allegro.cc/manual/al_free"><span class="a">al_free</span></a><span class="k2">(</span><span class="k2">)</span></span> to <span class="source-code"><a href="http://www.allegro.cc/manual/al_fclose"><span class="a">al_fclose</span></a><span class="k2">(</span><span class="k2">)</span></span>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Wed, 22 Dec 2010 14:20:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Makes sense. I&#39;ll keep that in mind.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Wed, 22 Dec 2010 14:24:17 +0000</pubDate>
	</item>
</rss>
