additional boost libraries?

I, like billions of other developers, have a medium sized project that for various reasons, invented its own thread, io, etc libraries. I'm thinkin of switching over to boost stuff for all my utility needs, but I'm wondering if boost has/possibly will have/is open to the possibility of adding/ or will never have the following facilities: serialization/object persistance (via iostreams) network socket iostreams UUID stuff (sometimes know as GUIDs) interface to dlls/.so loading url parsing (something like the filesystem lib) and, just out of curiosity: xml/html parsing Thanks in advance. -- // scopira.org | ninjacoder.com //

Hi Aleksander,
serialization/object persistance (via iostreams)
It's about to appear in 1.32: http://boost-consulting.com/boost/libs/serialization/doc/index.html
network socket iostreams UUID stuff (sometimes know as GUIDs) interface to dlls/.so loading
This is something I'd be interested to as well (including writing the code). What specifically do you need from such a library? Something like: boost::dll plugin("foo"); plugin["bar"].as<void (void)>(); or something trickier, like: - calling C++ functions: plugin.call<void (void)>("bar") -- no need for "extern "C" - some auto-registraction mechanisms plugin_registry<CodeGenerator> plugins; plugins.load("foo"); plugins.load("bar"); plugins["i386"].run(.......)
and, just out of curiosity: xml/html parsing
None so far. In fact, it seems unlikely that somebody will come along and implement all the XML stack (DOM, XPath, XML Schema, XSTL, whatever) right now. One chance would be is somebody boostify some existing XML toolkit -- but which one? Another chance is to initially create "tiny XML" library. In fact, both regression tools and serialization have their own tiny XML parsers and users aksed about XML support for program_options, so such library might really be usefull. - Volodya

Admittedly there are times I use expat (SOAP parsing) and times I use Apache (Xalan XPath parsing)... It would be really nice to have a friendlier interface to XPath support, as XPath expressions are being increasingly incorporated into web service messaging specifications. On Jul 20, 2004, at 6:18 AM, Vladimir Prus wrote:
Hi Aleksander,
serialization/object persistance (via iostreams)
It's about to appear in 1.32:
http://boost-consulting.com/boost/libs/serialization/doc/index.html
network socket iostreams UUID stuff (sometimes know as GUIDs) interface to dlls/.so loading
This is something I'd be interested to as well (including writing the code). What specifically do you need from such a library? Something like:
boost::dll plugin("foo"); plugin["bar"].as<void (void)>();
or something trickier, like:
- calling C++ functions:
plugin.call<void (void)>("bar") -- no need for "extern "C"
- some auto-registraction mechanisms
plugin_registry<CodeGenerator> plugins; plugins.load("foo"); plugins.load("bar");
plugins["i386"].run(.......)
and, just out of curiosity: xml/html parsing
None so far. In fact, it seems unlikely that somebody will come along and implement all the XML stack (DOM, XPath, XML Schema, XSTL, whatever) right now. One chance would be is somebody boostify some existing XML toolkit -- but which one?
Another chance is to initially create "tiny XML" library. In fact, both regression tools and serialization have their own tiny XML parsers and users aksed about XML support for program_options, so such library might really be usefull.
- Volodya
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Vladimir Prus <ghost@cs.msu.su> writes:
boost::dll plugin("foo"); plugin["bar"].as<void (void)>();
or something trickier, like:
- calling C++ functions:
plugin.call<void (void)>("bar") -- no need for "extern "C"
- some auto-registraction mechanisms
plugin_registry<CodeGenerator> plugins; plugins.load("foo"); plugins.load("bar");
plugins["i386"].run(.......)
Those are some really cool DSEL ideas! I love it! -- Dave Abrahams Boost Consulting http://www.boost-consulting.com

David Abrahams wrote:
Vladimir Prus <ghost@cs.msu.su> writes:
boost::dll plugin("foo"); plugin["bar"].as<void (void)>();
or something trickier, like:
- calling C++ functions:
plugin.call<void (void)>("bar") -- no need for "extern "C"
- some auto-registraction mechanisms
plugin_registry<CodeGenerator> plugins; plugins.load("foo"); plugins.load("bar");
plugins["i386"].run(.......)
Those are some really cool DSEL ideas! I love it!
Thanks! The problem is that to implement the coolest of them: plugin.call<void (void)>("bar") I'd need a C++ mangler for all platforms, and after initial look at just gcc name mangling spec I feel a bit scared. The first syntax should work in all cases, though. - Volodya

David Abrahams wrote:
Vladimir Prus <ghost@cs.msu.su> writes:
boost::dll plugin("foo"); plugin["bar"].as<void (void)>();
or something trickier, like:
- calling C++ functions:
plugin.call<void (void)>("bar") -- no need for "extern "C"
I love this! It would really be great! How about something like plugin.func<void(void)>("some_func") returning a callable functor - some wrapper over boost::function, which - will work as long as the plugin is in memory - will throw otherwise - eventually have a method for knowing if you can still call this function I'd certainly have uses for this. Best, John -- John Torjo Freelancer -- john@torjo.com Contributing editor, C/C++ Users Journal -- "Win32 GUI Generics" -- generics & GUI do mix, after all -- http://www.torjo.com/win32gui/ Professional Logging Solution for FREE -- http://www.torjo.com/code/logging.zip (logging - C++) -- http://www.torjo.com/logview/ (viewing/filtering - Win32) -- http://www.torjo.com/logbreak/ (debugging - Win32) (source code available)

John Torjo wrote:
David Abrahams wrote:
Vladimir Prus <ghost@cs.msu.su> writes:
boost::dll plugin("foo"); plugin["bar"].as<void (void)>();
or something trickier, like:
- calling C++ functions:
plugin.call<void (void)>("bar") -- no need for "extern "C"
I love this! It would really be great!
How about something like plugin.func<void(void)>("some_func") returning a callable functor - some wrapper over boost::function,
I think last message from Sven even suggests the syntax were you get boost::function. And you don't need a wrapper, BTW, you can just bind function to a functional object which can do what you ask below
which - will work as long as the plugin is in memory - will throw otherwise
Isn't it better to always keep the plugin in memory?
- eventually have a method for knowing if you can still call this function
Ah... this would need some wrapper over boost::function indeed. - Volodya
I'd certainly have uses for this.
Best, John

"Vladimir Prus" wrote:
or something trickier, like:
- calling C++ functions:
plugin.call<void (void)>("bar") -- no need for "extern "C"
- some auto-registraction mechanisms
plugin_registry<CodeGenerator> plugins; plugins.load("foo"); plugins.load("bar");
plugins["i386"].run(.......)
You may take look on polymorphic_map (in Boost.Files section). It is work in progress but useable and can serve as base for advanced object factory. /Pavel

Pavel Vozenilek wrote:
or something trickier, like:
- calling C++ functions:
plugin.call<void (void)>("bar") -- no need for "extern "C"
- some auto-registraction mechanisms
plugin_registry<CodeGenerator> plugins; plugins.load("foo"); plugins.load("bar");
plugins["i386"].run(.......)
You may take look on polymorphic_map (in Boost.Files section). It is work in progress but useable and can serve as base for advanced object factory.
Maybe, though in case of plugins classes are identified by names, not by they real types -- since the types are generally unknown in the caller. Speaking about the library itself, I'd really prefer if it were in sandbox -- I had no idea it exists. Ideally, it would be nice to have some "CVS digest", like: http://cvs-digest.org/index.php?issue=jul162004 to facilitate cooperation. For example, I was interested in polymorphic map where the keys do no have to derived from common base. I even think boost_sandbox/filesytem has some code like that. Bringing this all together would be good. - Volodya

On Tue, 20 Jul 2004, Vladimir Prus wrote:
interface to dlls/.so loading
This is something I'd be interested to as well (including writing the code). What specifically do you need from such a library? Something like:
boost::dll plugin("foo"); plugin["bar"].as<void (void)>();
I currently use a very slim wrapper around around dlopen() and the similar Win32 facility. Ofcourse, this requires big-hammer reinterpret casts, but my needs are very simple. Basically, my "plugs" export (extern "C") some kind of entry/registration function that my main app calls on load. The code is here: http://scopira.org/api/classscopira_1_1tool_1_1dll.html And could be a basis for a boost endevour. More C++/demangling/complex stuff could build on the basic symbol loading class... -- // scopira.org | ninjacoder.com //

On Tue, 20 Jul 2004 21:03:37 -0500 (CDT), Aleksander Demko wrote
The code is here:
http://scopira.org/api/classscopira_1_1tool_1_1dll.html
And could be a basis for a boost endevour. More C++/demangling/complex stuff could build on the basic symbol loading class...
I think not, the licensing isn't compatible: 00002 /* 00003 * Copyright (c) 2002 National Research Council 00004 * 00005 * All rights reserved. 00006 * 00007 * This material is confidential and proprietary information of 00008 * National Research Council Canada ("Confidential Information"). 00009 * This Confidential Information may only be used and reproduced 00010 * in accordance with the terms of the license agreement. 00011 * 00012 */ Seems to me this code shouldn't be posted on an open website. Jeff

On Tue, 20 Jul 2004, Jeff Garland wrote:
00004 * 00005 * All rights reserved. 00006 * 00007 * This material is confidential and proprietary information of 00008 * National Research Council Canada ("Confidential Information"). 00009 * This Confidential Information may only be used and reproduced 00010 * in accordance with the terms of the license agreement. 00011 * 00012 */
Seems to me this code shouldn't be posted on an open website.
That's our standard boiler plate header -- the app is released under the GPL. Besides, that's like a 20 line wrapper around dlopen and friends. There's only so many ways one can implement that. However, for any boost versions, recoding would be trivial and probably best. -- // scopira.org | ninjacoder.com //

On Thu, 22 Jul 2004 03:08:05 -0500 (CDT), Aleksander Demko wrote
On Tue, 20 Jul 2004, Jeff Garland wrote:
00004 * 00005 * All rights reserved. 00006 * 00007 * This material is confidential and proprietary information of 00008 * National Research Council Canada ("Confidential Information"). 00009 * This Confidential Information may only be used and reproduced 00010 * in accordance with the terms of the license agreement. 00011 * 00012 */
Seems to me this code shouldn't be posted on an open website.
That's our standard boiler plate header -- the app is released under the GPL.
Which, just so you know, is non-compatible as well. http://www.boost.org/more/license_info.html
Besides, that's like a 20 line wrapper around dlopen and friends. There's only so many ways one can implement that.
Sure.
However, for any boost versions, recoding would be trivial and probably best.
Yes, that would be necessary. Jeff

On Tue, 20 Jul 2004 01:19:33 -0500 (CDT), Aleksander Demko wrote
I, like billions of other developers, have a medium sized project that for various reasons, invented its own thread, io, etc libraries. I'm thinkin of switching over to boost stuff for all my utility needs, but I'm wondering if boost has/possibly will have/is open to the possibility of adding/ or will never have the following facilities:
serialization/object persistance (via iostreams)
In the 1.32 release.
network socket iostreams
There has been work on this, but it seems stalled... http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostSocket
UUID stuff (sometimes know as GUIDs)
No one is working on this, but it would be nice to have.
interface to dlls/.so loading
No one is working on this, also would be useful.
url parsing (something like the filesystem lib) No one is working on this, also would be useful.
and, just out of curiosity: xml/html parsing
There have been various discussions of this, but I'm not aware of a coherent effort. All the libraries you mention would be valuable in boost in my view -- contributions appreciated. See http://www.boost.org/more/submission_process.htm if you haven't already. Jeff

Jeff Garland wrote:
network socket iostreams
There has been work on this, but it seems stalled...
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostSocket Hugo Duncan opened a sourceforge project http://giallo.sourceforge.net to push this forward but the last commits were three months ago. Regards, Angus

On Tue, 20 Jul 2004, Angus Leeming wrote:
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostSocket
Hugo Duncan opened a sourceforge project http://giallo.sourceforge.net to push this forward but the last commits were three months ago.
Excellent. So that means it's done I take it :) -- // scopira.org | ninjacoder.com //

On Tue, 20 Jul 2004, Jeff Garland wrote:
serialization/object persistance (via iostreams)
In the 1.32 release.
Super. This is probably my #1 internal facility that I'd like to boostify. That and layerable streams (eg. serial objects, via compression, then encryption, over a network socket, etc).
network socket iostreams
There has been work on this, but it seems stalled...
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostSocket
Looks very similar to the article I just read in CUJ (Dec 01) on the very topic. If my iostreams kung-fu wasn't so weak, I'd try moving over my socket stuff over.
All the libraries you mention would be valuable in boost in my view -- contributions appreciated. See http://www.boost.org/more/submission_process.htm if you haven't already.
Neato, I just might do that. -- // scopira.org | ninjacoder.com //

On Tuesday 20 July 2004 15:40, Jeff Garland wrote:
On Tue, 20 Jul 2004 01:19:33 -0500 (CDT), Aleksander Demko wrote
and, just out of curiosity: xml/html parsing
There have been various discussions of this, but I'm not aware of a coherent effort.
All the libraries you mention would be valuable in boost in my view -- contributions appreciated. See http://www.boost.org/more/submission_process.htm if you haven't already.
Recently I implement some XML related code with the following features: - currently lightweight general XML classes like xml_node and xml_document. they are both uses STL (to hold parent/child releations, content and attributres) and (when needs to produce/parse real XML strings) libxml2. Sample code: xml_document doc(xml_node("root)); xml_node& root = doc.get_root(); xml_node::child_iterator c = root.insert_child(xml_node("node", "content")); c->insert_attribute("name", "value"); c->append_content("... more content."); // XML document is convertable to std::string std::string raw_xml = doc; cout << doc; // parse XML to new document uses another constructor xml_document rebuilded(raw_xml); - XML serialization subsystem -- a set of helpers to convert ANY (almost ;) type to XML and back to C/C++ type... sample code may look like this: int a = 10; xml_node n = xml_cast<xml_node>(a, "size"); // "size" is a node name (which is become XML 'tag' if XML output requierd int b = xml_cast<int>(n, "size"); // convert from xml_node back to int... // you may produce serializable types from 'usual' types at easy xml_serializable_data<map<int, float> > src("my_map"); src.value()[1] = 3.14; src.value()[2] = 2.73; xml_node my_map = src.to_xml(); // or using already known xml_cast :) // no need to pass a name... it is already known xml_node mm = xml_cast<xml_node>(src); - and finally I have implement a XML RPC like protocol to do remote calls: int foo(std::list<int>, std::string, const float*) { /* ... */} // to create XML RPC server you just need: // 1) connection maker object -- usual listener for servers xml_rpc_listener listener(port_number); // 2) RPC server object itself which will use sockets maden by listener xml_rpc_server server(&listener); // 3) add/register XML method(s) on server server.add_method( xml_rpc_server_method< int(std::list<int>, std::string, const float*) >("xml_foo", &foo) ); // ... // to call remote method you need: // 1) connection maker object -- usual active connector for clients xml_rpc_connector connector("localhost", port_number); // 2) client object which will use socket produce by connector xml_rpc_client_p2p client(&connector); // 3) XML method/functor -- this is a real functor, so you may pass it // everywhere a functor maybe passed... even for std algorithms ;) xml_rpc_client_method<int(std::list<int>, std::string, const float*)> remote_foo("xml_foo", &client); // now call it! ;) std::list<int> my_list; my_list.push_back(123); const float* pi_ptr = new float(3.14); remote_foo(my_list, "super string", pi_ptr); You even may catch __remote__ exception if server's foo throw it :) All of above used in project I worked on currently, but if it can be interested for someone else I can start to boostify this... :) have fun!

zaufi@sendmail.ru wrote:
Recently I implement some XML related code with the following features:
- currently lightweight general XML classes like xml_node and xml_document. they are both uses STL (to hold parent/child releations, content and attributres) and (when needs to produce/parse real XML strings) libxml2. Sample code: [...]
Looks great.
- XML serialization subsystem -- a set of helpers to convert ANY (almost ;) type to XML and back to C/C++ type... sample code may look like this: [...]
Also excellent.
- and finally I have implement a XML RPC like protocol to do remote calls: [...]
Don't care much about this myself, but it certainly looks useful and simple enough.
All of above used in project I worked on currently, but if it can be interested for someone else I can start to boostify this... :)
I am definitely interested. Actually, if you decide not to boostify it (though I certainly hope you do), would you consider making it available some other way? -- Daniel

On Wednesday 21 July 2004 14:05, Daniel Wesslén wrote:
I am definitely interested. Actually, if you decide not to boostify it (though I certainly hope you do), would you consider making it available some other way? Yes I do. I have plans (if boosters reject this lib) to start a project on SF.net...

Aleksander Demko <ademko <at> shaw.ca> writes:
I, like billions of other developers, have a medium sized project that for various reasons, invented its own thread, io, etc libraries. I'm thinkin of switching over to boost stuff for all my utility needs, but I'm wondering if boost has/possibly will have/is open to the possibility of adding/ or will never have the following facilities:
serialization/object persistance (via iostreams) network socket iostreams UUID stuff (sometimes know as GUIDs) interface to dlls/.so loading url parsing (something like the filesystem lib)
and, just out of curiosity: xml/html parsing
Thanks in advance.
--
Hi Aleksander,
interface to dlls/.so loading
As it so happens, I just started working on such a beast last week. I'm still in the experimentation/concept phase. These are the use cases I definitely want to support: * cross platform loading (by name) and using of symbols (functions/PODs) * handling of optional OS functionality (e.g. binding at runtime to OS API functions that aren't available in all versions of the target OS) Since I'm only experimenting I did not pay too much attention yet to the interface, but I'm thinking along these lines: * a simple interface to load a library by name or path and query the address of symbols by name * a boost::function-like type that can bind to a function at runtime and call it * a scoped_ptr or smart_ptr-like type that can bind to exported PODs at runtime One thing I'm currently experimenting with is automatic decoration based on a symbol's signature and qualified name. Currently I already have these decorators (for MSVC): * plain: no decoration * stdcall: decorating function names with the __stdcall calling convention * fastcall: decorating function names with the __fastcall calling convention * char_type: decorating a function by appending 'W' (in UNICODE builds) or 'A', for binding to Windows API calls * combined: a decorator that tries any combination of decorators to find the function to bind to * cdecl: (a work in progress) decorates a name using the compiler's name mangling scheme The last decorator is the most ambitious and potentially the least portable. I'm still pursuing it because it can result better portability of user code. Consider the following example of the loading plugins from a shared library: std::vector< boost::shared_ptr<IPlugin> > LoadPlugins( std::string piLib ) { import::function< std::vector< boost::shared_ptr<IPlugin> >()> GetPluginList( "SomeApp::_3rdParty::GetPluginList", piLib ); std::vector< boost::shared_ptr<IPlugin> > plugins = GetPluginList(); return plugins; } Using only the function signature and the qualified name of the exported function the user could bind to the exported function on every supported compiler, without having to resort to workarounds like extern "C" functions that suppress name mangling, but also prohibit the use of non-POD types. To improve the portability all decorators are composed of base decorators that can be combined to form more complex ones. Furthermore I think I can come up with a tool that (for a lot of compilers) generates the base decorators by analysing a map file produced by compilig and linking a source file with known function names/signatures. Even so, it will obviously not be possible to port all of the functionality of the library to all compilers/platforms. The basic interface should be highly portable however. Since this is a rather ambitious project and I can only work on it a couple of hours a week (at most), it will take quite a while to finish. But if you're interested, I can keep you updated. Svenne.

Sven Van Echelpoel wrote:
* cdecl: (a work in progress) decorates a name using the compiler's name mangling scheme
The last decorator is the most ambitious and potentially the least portable. I'm still pursuing it because it can result better portability of user code.
Actually, I now think it will be very hard to do, and will give very little benefit....
Consider the following example of the loading plugins from a shared library:
std::vector< boost::shared_ptr<IPlugin> > LoadPlugins( std::string piLib ) {
import::function< std::vector< boost::shared_ptr<IPlugin> >()>
GetPluginList( "SomeApp::_3rdParty::GetPluginList", piLib );
std::vector< boost::shared_ptr<IPlugin> > plugins = GetPluginList();
return plugins;
}
Using only the function signature and the qualified name of the exported function the user could bind to the exported function on every supported compiler, without having to resort to workarounds like extern "C" functions that suppress name mangling, but also prohibit the use of non-POD types.
... because if you mostly load some classes, it does not really matter if the single function is extern "C" or not.
To improve the portability all decorators are composed of base decorators that can be combined to form more complex ones. Furthermore I think I can come up with a tool that (for a lot of compilers) generates the base decorators by analysing a map file produced by compilig and linking a source file with known function names/signatures.
You mean you'd write a tool which will automatically write name mangler, or I misunderstood you? In any way, http://www.codesourcery.com/cxx-abi/abi.html#mangling is complex.
Since this is a rather ambitious project and I can only work on it a couple of hours a week (at most), it will take quite a while to finish. But if you're interested, I can keep you updated.
Probably, you could start by explaining your vision of the library first. Of three points you've given: * a simple interface to load a library by name or path and query the address of symbols by name * a boost::function-like type that can bind to a function at runtime and call it * a scoped_ptr or smart_ptr-like type that can bind to exported PODs at runtime The two last seems very vague for me. For example, how the second is different from: boost::function<void (void)> f = static_cast<void (*void)>dlsym(h, "whatever") - Volodya

Vladimir Prus <ghost <at> cs.msu.su> writes:
Probably, you could start by explaining your vision of the library first. Of three points you've given:
The problems I would like to solve for myself are: 1) Often you need to write progams that need to work on different versions of a particular OS, with later versions having additional API calls that you could use. You end up writing stubs for those functions that at runtime check the availability of the API function, use it if it's available or do something different when it's not. It would be nice if it could be coded like so: void MyAPIStub() { static imported_function<void()> apiFunc( "ApiFunc", "OSLib" ); if ( !apiFunc ) { // do something here } apiFunc(); } Altough I acknowlege that the locking required in multi-threaded progams would clutter the syntax (more than) a little. 2) When creating plugin interfaces, having to go through extern "C" is a bit ugly to me. At the same time it ditches the C++ type safety. Being able to export a C++ plugin function and have the import library figure out the name mangling for me would improve the both the readability and the correctness of the program
* a simple interface to load a library by name or path and query the address of symbols by name * a boost::function-like type that can bind to a function at runtime and call it * a scoped_ptr or smart_ptr-like type that can bind to exported PODs at runtime
The two last seems very vague for me. For example, how the second is different from:
boost::function<void (void)> f = static_cast<void (*void)>dlsym(h, "whatever")
- Volodya
Yeah, yesterday morning I was already thinking more of something like this boost::function<void()> f1 = import<void()>( "lib", "whatever" ); boost::function<void()> f2 = import<void()>( lib, "whatever" ); boost::function<void()> f3 = import<void()>( lib, "whatever", some_decorator () ); As far as the cdecl decorator and the tool is concerned. I have always considered it very likely that I would fail and not achieve what I want, but that won't stop me from trying. Svenne

"Aleksander Demko" <ademko@shaw.ca> wrote in message news:Pine.LNX.4.58.0407200104550.5300@ryu.ninjacoder.com...
I, like billions of other developers, have a medium sized project that for various reasons, invented its own thread, io, etc libraries. I'm thinkin of switching over to boost stuff for all my utility needs, but I'm wondering if boost has/possibly will have/is open to the possibility of adding/ or will never have the following facilities:
url parsing (something like the filesystem lib)
I've written code to parse URI's according to RFC 2396 (URI Generic Syntax). It's part of a library that allows iterating through archives such as zip files in a manner similar to Boost.Filesystem. Right now it's not nearly as portable, elegant or free as Boost.Filesystem, but if my iostreams library is approved later this year I may consider boostifying all or part of it and submitting it for review. Jonathan

On Tue, 20 Jul 2004 01:19:33 -0500 (CDT) Aleksander Demko <ademko@shaw.ca> wrote:
UUID stuff (sometimes know as GUIDs)
I have one of these that is fairly easy to use, and conforms to the most recent draft (http://www.ietf.org/internet-drafts/draft-mealling-uuid-urn-03.txt). However, part of the code uses a md5 hash. Is it acceptable to assume that MD5 hash implementations are widely enough available that they can be used, or would I also have to provide an independent boostified implementation as well?
participants (14)
-
Aleksander Demko
-
Angus Leeming
-
Daniel Wesslén
-
David Abrahams
-
Jeff Garland
-
Jody Hagins
-
John Fuller
-
John Torjo
-
Jonathan Turkanis
-
Pavel Vozenilek
-
Sven Van Echelpoel
-
Vladimir Prus
-
zaufi
-
zaufi@sendmail.ru