Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Buckminster » Beginners questions
Beginners questions [message #910110] Sat, 08 September 2012 13:56 Go to next message
Jan Krakora is currently offline Jan Krakora
Messages: 477
Registered: December 2009
Location: Prague
Senior Member
Hi, I would like to build my simple RCP product with the headless Buckmister.

I have one feature containing the product definition and about 10 plugins. All is stored in SVN repo. I have also a target platform which is stored on the file system where the build is done. Its just a directory "plugins" with many plugins within.

I have few questions and I would appreciate your help.

1) Do I need the RMAP for every plugin my product contains? Especially do I need it for plugins that are in the target platform?

2) If the target platform contains same plugin as is one of those stored in svn and I need to use the one from SVN in the build, how can I tell it to the Buckminster? Should I use an advisor with adjusted scope somehow in the CQUERY?

Thanks
Re: Beginners questions [message #910726 is a reply to message #910110] Mon, 10 September 2012 05:32 Go to previous messageGo to next message
Thomas Hallgren is currently offline Thomas Hallgren
Messages: 3214
Registered: July 2009
Senior Member
On 2012-09-08 19:56, Jan Krakora wrote:
> Hi, I would like to build my simple RCP product with the headless Buckmister.
>
> I have one feature containing the product definition and about 10 plugins. All is stored in SVN repo. I have also a
> target platform which is stored on the file system where the build is done. Its just a directory "plugins" with many
> plugins within.
>
> I have few questions and I would appreciate your help.
>
> 1) Do I need the RMAP for every plugin my product contains? Especially do I need it for plugins that are in the target
> platform?
>
No, you typically use one RMAP. The RMAP contains definitions that will allow Buckminster to find your sources and your
binaries. It will help a lot if the binaries can be found in p2 or maven repositories.

> 2) If the target platform contains same plugin as is one of those stored in svn and I need to use the one from SVN in
> the build, how can I tell it to the Buckminster? Should I use an advisor with adjusted scope somehow in the CQUERY?
>
That's one way of doing it. You would probably base this on filters that would enable/disable RMAP locators. The filters
in turn use properties. The properties can be defined in your CQUERY or passed in to your build using -Dxxx=yyy vm
arguments or a -P <property file>.

HTH,
- thomas
Re: Beginners questions [message #910772 is a reply to message #910726] Mon, 10 September 2012 07:22 Go to previous messageGo to next message
Jan Krakora is currently offline Jan Krakora
Messages: 477
Registered: December 2009
Location: Prague
Senior Member
[quote title=Thomas Hallgren wrote on Mon, 10 September 2012 11:32]On 2012-09-08 19:56, Jan Krakora wrote:
> No, you typically use one RMAP. The RMAP contains definitions that will allow Buckminster to find your sources and your
> binaries. It will help a lot if the binaries can be found in p2 or maven repositories.

I mean, do I need locator in the RMAP for plugins, that are in my target platform?
Re: Beginners questions [message #910797 is a reply to message #910772] Mon, 10 September 2012 08:03 Go to previous messageGo to next message
Thomas Hallgren is currently offline Thomas Hallgren
Messages: 3214
Registered: July 2009
Senior Member
On 2012-09-10 13:22, Jan Krakora wrote:
> [quote title=Thomas Hallgren wrote on Mon, 10 September 2012 11:32]On 2012-09-08 19:56, Jan Krakora wrote:
>> No, you typically use one RMAP. The RMAP contains definitions that will allow Buckminster to find your sources and
>> your binaries. It will help a lot if the binaries can be found in p2 or maven repositories.
>
> I mean, do I need locator in the RMAP for plugins, that are in my target platform?
>
You typically use Buckminster and the RMAP to actually build your target platform for you. If you don't, then you will
not use any locators for your TP components.

- thomas
Re: Beginners questions [message #910798 is a reply to message #910772] Mon, 10 September 2012 08:04 Go to previous messageGo to next message
Henrik Lindberg is currently offline Henrik Lindberg
Messages: 2498
Registered: July 2009
Senior Member
On 2012-10-09 13:22, Jan Krakora wrote:
> [quote title=Thomas Hallgren wrote on Mon, 10 September 2012 11:32]On
> 2012-09-08 19:56, Jan Krakora wrote:
>> No, you typically use one RMAP. The RMAP contains definitions that
>> will allow Buckminster to find your sources and your binaries. It will
>> help a lot if the binaries can be found in p2 or maven repositories.
>
> I mean, do I need locator in the RMAP for plugins, that are in my target
> platform?
>
The RMAP is used to locate and *create* the target platform, so yes, you
want to have them in your RMAP.

The RMAP is used when you materialize the things to work on in a new
workspace (or update an existing one). Materialization creates the TP
and adds required projects to the workspace.

Once materialization has taken place, the RMAP has no further role.

Recommend a quick read through of the introductory chapters in the Bucky
Book downloadable from the Buckminster download page.

- henrik
Re: Beginners questions [message #911191 is a reply to message #910798] Tue, 11 September 2012 02:58 Go to previous messageGo to next message
Alex Prak is currently offline Alex Prak
Messages: 10
Registered: September 2012
Junior Member
Do I need the materializing only for building the Project?

I already have an existing automated Build with ant. The results of the Build are about 15 Jars.

I only need to create my RCP Product now (exe...). Do I need to create the whole Process with materialize, build.. in Buckminster or can I just give Buckminster the Jars to create my Product.

In Eclipse the Export Product works perfect.
Re: Beginners questions [message #911301 is a reply to message #911191] Tue, 11 September 2012 06:16 Go to previous messageGo to next message
Jan Krakora is currently offline Jan Krakora
Messages: 477
Registered: December 2009
Location: Prague
Senior Member
Henrik Lindberg wrote on Mon, 10 September 2012 14:04
The RMAP is used when you materialize the things to work on in a new
workspace (or update an existing one). Materialization creates the TP
and adds required projects to the workspace.

Once materialization has taken place, the RMAP has no further role.

Recommend a quick read through of the introductory chapters in the Bucky
Book downloadable from the Buckminster download page.

Actually, I have read it twice. But I'm still stepping in the dark. I can't understand
how is the process of materialization called, when and by whom.

Let's say the headless Buckminster. I set a workspace directory to it, then I set targetPlatformPath to it.
There are some plugins in the target platform already.

I would like to build a p2.site of a feature.

Ok, I call import a cquery which in turns resolves and materializes all required components. The feature has
dependency on some plugins from the target platform and some plugins stored on my local file system. So I have a
RMAP file to get those local plugins properly (not those from target platform, they are available to the buckmister already).

The materialization process copy those local plugins to its wokspace as a components(containing those plugins as artifacts) or just as a eclipse plugins?

The adviser nodes in cquery are called when the components are materialized or when?

What about next headless build, are those components/plugins in the workspace refreshed? If the feature doesn't contains a plugin any more is that plugin/component deleted from the buckminster's workspace?

Thank you very much Henrik
Re: Beginners questions [message #911307 is a reply to message #911191] Tue, 11 September 2012 06:21 Go to previous messageGo to next message
Henrik Lindberg is currently offline Henrik Lindberg
Messages: 2498
Registered: July 2009
Senior Member
On 2012-11-09 8:58, Alex Prak wrote:
> Do I need the materializing only for building the Project?
>
Materialization is done when:
- setting up a new workspace, new contributor, new scenario (branch x on
platform y).
- building exactly the same headlessly (as you build in your IDE), which
typically means you do not have the material when you start.
- You need to update the configuration because dependencies changed, or
there are newer versions that you want to build against.

You naturally do not need to materialize if all of the required material
is already where it is supposed to be.

When you are building a RCP app, you typically want zipped ready to run
versions of your app, as well as a p2 update site that these apps can
update from. When you have already build jars manually, they may not
have all the metadata that is required for a smooth ride, but it depends
on what they are, and how they are used.

Does your app build in the IDE without your ant build scripts?
If so, Buckminster can automate all of it without you having to do much.

OTOH, Buckminster can work with the jars and just pick them from disk -
this is all described in the Bucky Book.

Regards

- henrik

> I already have an existing automated Build with ant. The results of the
> Build are about 15 Jars.
>
> I only need to create my RCP Product now (exe...). Do I need to create
> the whole Process with materialize, build.. in Buckminster or can I just
> give Buckminster the Jars to create my Product.
>
> In Eclipse the Export Product works perfect.
Re: Beginners questions [message #911315 is a reply to message #911301] Tue, 11 September 2012 06:41 Go to previous messageGo to next message
Henrik Lindberg is currently offline Henrik Lindberg
Messages: 2498
Registered: July 2009
Senior Member
On 2012-11-09 12:16, Jan Krakora wrote:
> Henrik Lindberg wrote on Mon, 10 September 2012 14:04
>> The RMAP is used when you materialize the things to work on in a new
>> workspace (or update an existing one). Materialization creates the TP
>> and adds required projects to the workspace.
>>
>> Once materialization has taken place, the RMAP has no further role.
>>
>> Recommend a quick read through of the introductory chapters in the
>> Bucky Book downloadable from the Buckminster download page.
>
> Actually, I have read it twice. But I'm still stepping in the dark. I
> can't understand
> how is the process of materialization called, when and by whom.
>
1. start with a fresh IDE
2. install Buckminster
3. get the URL to a cquery (or obtain the cquery through other means)
4. open the cquery editor and run the query to materialize the workspace
and TP
5. build

The cquery needs an RMAP to be able to find what you asked for.

It works exactly the same way headlessly.

> Let's say the headless Buckminster. I set a workspace directory to it,
> then I set targetPlatformPath to it.
> There are some plugins in the target platform already.
>
> I would like to build a p2.site of a feature.
>
> Ok, I call import a cquery which in turns resolves and materializes all
> required components. The feature has
> dependency on some plugins from the target platform and some plugins
> stored on my local file system.

Right, but note that "dependency on plugins from the target platform" is
not quite correct - the dependency is on the plugins, and they need to
be in the target platform to enable your plugin(s) to be built.

Think of TP as "everything needed that is not in my workspace". One
misconception is that the TP is "what is installed into the IDE" when
that is just one possible source of components (and probably not the
exact set of things you require).

> So I have a
> RMAP file to get those local plugins properly (not those from target
> platform, they are available to the buckmister already).
>
> The materialization process copy those local plugins to its wokspace as
> a components(containing those plugins as artifacts) or just as a eclipse
> plugins?
>
Materialization makes material available - either as part of the
workspace (a project), into the active TP, or to some location of your
choice on disk. There are sane defaults, and you can override those with
a MSpec. (You typically do not need a Mspec).

> The adviser nodes in cquery are called when the components are
> materialized or when?
>
When materialized. The query performs Resolution and Materialization.
You can run a query without materialization if you just want to know how
the query will be resolved.

> What about next headless build, are those components/plugins in the
> workspace refreshed? If the feature doesn't contains a plugin any more
> is that plugin/component deleted from the buckminster's workspace?
>
Buckminster does not delete plugins from your workspace, but it adds
what is missing/required. The same is true for the TP.

Typically, when setting up things you start with both an empty workspace
and empty TP. This is easiest both in the IDE and when doing things
headless. (In the IDE, there are unwanted side effects if your TP
contains multiple versions of a plugin (i.e. you need to manually tweak
your launch configurations).

When building headless it is typically set up in a way that the TP is
materialized separately and builds just materialize "your stuff".

> Thank you very much Henrik

Start by making your build work in the IDE.

Hope that helps.
- henrik
Re: Beginners questions [message #911787 is a reply to message #911315] Wed, 12 September 2012 06:16 Go to previous messageGo to next message
Jan Krakora is currently offline Jan Krakora
Messages: 477
Registered: December 2009
Location: Prague
Senior Member
> The adviser nodes in cquery are called when the components are
> materialized or when?

> > When materialized. The query performs Resolution and Materialization.
> > You can run a query without materialization if you just want to know how
> > the query will be resolved.

I don't understand.

In adviser node I can set the scope in which the bundle is searched when resolving.
There is Workspace, Target platform, Materialization and Resolution Service.

If I have two eclipse plugins (with same name and version, but different class file(s)), the first one is in the workspace
and she second one is in the target platform, how can I tell the Buckminster to pick up the one from workspace when building?

I have unchecked the Target platform in the scope and it picks up the plugin from the workspace, without any adviser, it picks up the plugin from the target platform.

I would understand an advising mechanism when I have to chose between night and stable builds when fetching plugins from a repository.
I know, this can be done by properties in the RMAP.

How concrete are adviser used? Who is using the adviser where I unchecked the Target platform. You have said the materialization process,
but those both plugins are already in their places (workspace and target platform). So it must be another part of build, because as I wrote above, it
picks up the plugin from workspace.

What is the resolution process by the way? Is it just about creating a virtual dependency graph for requested component?

Thanks for your responses Henrik.
Re: Beginners questions [message #911878 is a reply to message #911787] Wed, 12 September 2012 09:49 Go to previous messageGo to next message
Henrik Lindberg is currently offline Henrik Lindberg
Messages: 2498
Registered: July 2009
Senior Member
On 2012-12-09 12:17, Jan Krakora wrote:
>> The adviser nodes in cquery are called when the components are
>> materialized or when?
>
>> > When materialized. The query performs Resolution and Materialization.
>> > You can run a query without materialization if you just want to know
>> how
>> > the query will be resolved.
>
> I don't understand.
> In adviser node I can set the scope in which the bundle is searched when
> resolving.
> There is Workspace, Target platform, Materialization and Resolution
> Service.
>
> If I have two eclipse plugins (with same name and version, but different
> class file(s)), the first one is in the workspace and she second one is
> in the target platform, how can I tell the Buckminster to pick up the
> one from workspace when building?
>
> I have unchecked the Target platform in the scope and it picks up the
> plugin from the workspace, without any adviser, it picks up the plugin
> from the target platform.
>
Not sure how you control that. I would make sure that the unwanted
component is not in the TP.

> I would understand an advising mechanism when I have to chose between
> night and stable builds when fetching plugins from a repository. I know,
> this can be done by properties in the RMAP.
>
> How concrete are adviser used? Who is using the adviser where I
> unchecked the Target platform. You have said the materialization
> process, but those both plugins are already in their places (workspace
> and target platform). So it must be another part of build, because as I
> wrote above, it
> picks up the plugin from workspace.
>
Advisor nodes in a cquery only affects resolution (and possibly
subsequent materialization), a cquery is not involved when building. A
build is always based on the content of the workspace, and the TP.

> What is the resolution process by the way? Is it just about creating a
> virtual dependency graph for requested component?
>
Resolution is done as part of materialization (the first job is to
figure out what is required, naturally). When doing the resolution,
buckminster must naturally have access to the meta data of the material,
if it is already present it will read what is there). If you expect
different results based on different queries, and you have a TP, and use
it when resolving, you need to remove the TP content first (so it can be
refreshed with only the things you need given the cquery and its advisor
nodes).

Hope that helps.
- henrik
Re: Beginners questions [message #912240 is a reply to message #910110] Thu, 13 September 2012 03:33 Go to previous messageGo to next message
Alex Prak is currently offline Alex Prak
Messages: 10
Registered: September 2012
Junior Member
Hey, thanks for your help!

Ok then I need Materialization, because I need a headlessly build.

The whole Project contains 14 Projects (osgi.bundle) and one product.project, which has dependencies on the other projects. Do I need one RMAP and CQUERY for the product.project or do I need the files for every project?

I almost read the whole Buckminster documentation, but anyway its a strange subject and its hard to work with it. In my IDE the build works without Ant. But I have automated the Build with Ant for the Continuous Integration Server. The results are jars for every project.

I only need the generation of the exe and so on now. How can I start the process from the shell? Here is my first attempt for a RMAP and a CQUERY file.


CQUERY
<?xml version="1.0" encoding="UTF-8"?>
<cq:componentQuery xmlns:cq="http://www.eclipse.org/buckminster/CQuery-1.0">
    <cq:rootRequest name="de.bsp.tdb.product" componentType="osgi.bundle"/>
</cq:componentQuery>


RMAP
<?xml version="1.0" encoding="UTF-8"?>
<rmap xmlns="http://www.eclipse.org/buckminster/RMap-1.0" 
	
	<searchPath name="Dependencies">
		<!-- dependencies project-->
		<provider readerType="local" componentTypes="osgi.bundle,eclipse.feature" mutable="true" source="true">
			<uri format="{0}/{1}/">
				<bc:propertyRef key="workspace.root" />
				<bc:propertyRef key="buckminster.component" />
			</uri>
		</provider>
	</searchPath>

	<!-- locator for jar dependencies (org.eclipse.core.runtime.....)
	<locator searchPathRef="Dependencies" pattern="^org(\..+)?" failOnError="false" />
	
	<!-- locator for other projects -->
	<locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj1" failOnError="false" />
	<locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj2" failOnError="false" />
	<locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj3" failOnError="false" />
	<locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj4" failOnError="false" />
	<locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj5" failOnError="false" />
	<locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj6" failOnError="false" />
	<locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj7" failOnError="false" />
	...
</rmap>
Re: Beginners questions [message #912248 is a reply to message #911878] Thu, 13 September 2012 03:40 Go to previous messageGo to next message
Jan Krakora is currently offline Jan Krakora
Messages: 477
Registered: December 2009
Location: Prague
Senior Member
Aaaaaa, so if I have two plugins with same name and version, one in the workspace and one in the target platform,
there is no way how to tell the Buckminster to pick up the one from workspace when building?
Re: Beginners questions [message #912295 is a reply to message #912248] Thu, 13 September 2012 05:26 Go to previous messageGo to next message
Henrik Lindberg is currently offline Henrik Lindberg
Messages: 2498
Registered: July 2009
Senior Member
On 2012-13-09 9:40, Jan Krakora wrote:
> Aaaaaa, so if I have two plugins with same name and version, one in the
> workspace and one in the target platform,
> there is no way how to tell the Buckminster to pick up the one from
> workspace when building?

afaik, this is controlled by the Eclipse build system, not Buckminster.
Buckminster performs the workspace build. You should be seeing the same
behavior in the IDE even if Buckminster was not involved at all.

Which Buckminster-build are your referring to?

- henrik
Re: Beginners questions [message #912300 is a reply to message #912240] Thu, 13 September 2012 05:32 Go to previous messageGo to next message
Henrik Lindberg is currently offline Henrik Lindberg
Messages: 2498
Registered: July 2009
Senior Member
Ok, if it works in the IDE without ANT, you don't need the ANT way in
your CI build either.

Typically very little is needed, and most (if not all) of the
Buckminster specific things can be kept in a "releng" project.

Take a look at the project cloudsmith / geppetto @ github. We use that
to build Geppetto, an IDE for puppet development and it is using
Buckminster. It builds a complete product and outputs a p2 repository
and product zips for several different platforms.

The project is also built using Jenkins CI using the exact same setup.

Regards
- henrik


On 2012-13-09 9:33, Alex Prak wrote:
> Hey, thanks for your help!
>
> Ok then I need Materialization, because I need a headlessly build.
>
> The whole Project contains 14 Projects (osgi.bundle) and one
> product.project, which has dependencies on the other projects. Do I need
> one RMAP and CQUERY for the product.project or do I need the files for
> every project?
>
> I almost read the whole Buckminster documentation, but anyway its a
> strange subject and its hard to work with it. In my IDE the build works
> without Ant. But I have automated the Build with Ant for the Continuous
> Integration Server. The results are jars for every project.
>
> I only need the generation of the exe and so on now. How can I start the
> process from the shell? Here is my first attempt for a RMAP and a CQUERY
> file.
>
>
> CQUERY
> <?xml version="1.0" encoding="UTF-8"?>
> <cq:componentQuery
> xmlns:cq="http://www.eclipse.org/buckminster/CQuery-1.0">
> <cq:rootRequest name="de.bsp.tdb.product" componentType="osgi.bundle"/>
> </cq:componentQuery>
>
>
> RMAP
> <?xml version="1.0" encoding="UTF-8"?>
> <rmap xmlns="http://www.eclipse.org/buckminster/RMap-1.0"
> <searchPath name="Dependencies">
> <!-- dependencies project-->
> <provider readerType="local"
> componentTypes="osgi.bundle,eclipse.feature" mutable="true" source="true">
> <uri format="{0}/{1}/">
> <bc:propertyRef key="workspace.root" />
> <bc:propertyRef key="buckminster.component" />
> </uri>
> </provider>
> </searchPath>
>
> <!-- locator for jar dependencies (org.eclipse.core.runtime.....)
> <locator searchPathRef="Dependencies" pattern="^org(\..+)?"
> failOnError="false" />
>
> <!-- locator for other projects -->
> <locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj1"
> failOnError="false" />
> <locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj2"
> failOnError="false" />
> <locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj3"
> failOnError="false" />
> <locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj4"
> failOnError="false" />
> <locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj5"
> failOnError="false" />
> <locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj6"
> failOnError="false" />
> <locator searchPathRef="Dependencies" pattern="de.bsp.tdb.proj7"
> failOnError="false" />
> ...
> </rmap>
Re: Beginners questions [message #912357 is a reply to message #912300] Thu, 13 September 2012 08:19 Go to previous messageGo to next message
Jan Krakora is currently offline Jan Krakora
Messages: 477
Registered: December 2009
Location: Prague
Senior Member
> Which Buckminster-build are your referring to?

site.p2 and then creating a product from that site by ant call to p2 director
Re: Beginners questions [message #912890 is a reply to message #910110] Fri, 14 September 2012 07:00 Go to previous message
Alex Prak is currently offline Alex Prak
Messages: 10
Registered: September 2012
Junior Member
Hey Henrik,

thanks for your help.

Well I created a special "buckminster-project" too. My projects have the name de.bsp.tdb.common, de.bsp.tdb.core and so on. The Product-project name is de.bsp.tdb.product and the buckminster project is de.bsp.tdb.product.site. In this project i have the rcp.target, site.cquery, site.rmap, feature.xml and a buckminster.properties.

I use Jenkins to build the project. But everytime I build, i get the following error message:

INFO: importtargetdefinition '-A' '/D:/Jenkins/workspace/test/trunk/de.bsp.tdb.product.site/rcp.target'
INFO: import '/D:Jenkins/workspace/test/trunk/de.bsp.tdb.product.site/site.cquery'
ERROR [0001] : No suitable provider for component de.bsp.tdb.product.site:eclipse.feature was found in resourceMap file:/D:/Jenkins/workspace/test/trunk/de.bsp.tdb.product.site/site.rmap
ERROR [0001] : No suitable provider for component de.bsp.tdb.product.site:eclipse.feature was found in searchPath project
ERROR [0001] : Rejecting provider local(file:///{0}/trunk/{1}/[file:///D:/Jenkins/workspace/test/trunk/de.bsp.tdb.product.site/]): Components of type eclipse.feature are not supported
INFO: TAG-ID 0001 = Query for de.bsp.tdb.product.site:eclipse.feature




I dont know wheres the problem. When I add eclipse.feature to the componentTypes, it founds thousands of Components and throws following error for each component.

ERROR [0002] : No suitable provider for component org.eclipse.emf.ecore.change:osgi.bundle was found in resourceMap file:/D:/Jenkins/workspace/test/trunk/de.bsp.tdb.product.site/site.rmap
ERROR [0002] : No suitable provider for component org.eclipse.emf.ecore.change:osgi.bundle was found in searchPath resources
ERROR [0002] : Resolution attempt ended with exception: Provider local(file:///D:/Jenkins/workspace/test/trunk/org.eclipse.emf.ecore.change/): Missing CSpec source required by component type osgi.bundle
ERROR Provider local(file:///D:/Jenkins/workspace/test/trunk/org.eclipse.emf.ecore.change/): Missing CSpec source required by component type osgi.bundle




The target platform (rcp.target) I just exported with eclipse. I dont create a new one. There was a running Platform (active), which has the ${eclipse_home} location with 519 plug-ins.


Do you have an Idea, what Iam doing wrong?
Previous Topic:Target platform not working correctly
Next Topic:Call/Define JUnit from CSpec
Goto Forum:
  


Current Time: Fri Jul 25 16:35:38 EDT 2014

Powered by FUDForum. Page generated in 0.03484 seconds