1188: "Bonding"

This forum is for the individual discussion thread that goes with each new comic.

Moderators: Moderators General, Prelates, Magistrates

gormster
Posts: 233
Joined: Mon Jul 23, 2007 6:43 am UTC
Location: Sydney

1188: "Bonding"

Postby gormster » Wed Mar 20, 2013 4:17 am UTC

Image

Title text: I'm trying to build character but Eclipse is really confusing.
http://xkcd.com/1188/

I remember when this site used to have comics on it.
Eddie Izzard wrote:And poetry! Poetry is a lot like music, only less notes and more words.

User avatar
rhomboidal
Posts: 797
Joined: Wed Jun 15, 2011 5:25 pm UTC
Contact:

Re: 1188: "Bonding"

Postby rhomboidal » Wed Mar 20, 2013 4:19 am UTC

Hehe, this Java code is even more laughable than mine often is.

Temporarily9
Posts: 3
Joined: Wed Mar 20, 2013 4:18 am UTC

Re: 1188: "Bonding"

Postby Temporarily9 » Wed Mar 20, 2013 4:20 am UTC

Yeah, like last week.

I only know the basics of programming, so this one is mostly over my head, but I know enough to get the joke. Sort of. I think. Maybe.

lpvb
Posts: 2
Joined: Wed Mar 20, 2013 4:20 am UTC

Re: 1188: "Bonding"

Postby lpvb » Wed Mar 20, 2013 4:21 am UTC

I'm guessing this program never halts?

drummerpatch
Posts: 18
Joined: Wed Jul 11, 2012 7:03 pm UTC

Re: 1188: "Bonding"

Postby drummerpatch » Wed Mar 20, 2013 4:21 am UTC

There are so many things wrong with this code that it makes me cringe (I know they were all purposeful, don't worry), but at the same time I can't help but smile at the brilliance of it.

lpvb
Posts: 2
Joined: Wed Mar 20, 2013 4:20 am UTC

Re: 1188: "Bonding"

Postby lpvb » Wed Mar 20, 2013 4:22 am UTC

I'm guessing this program never halts? Also, I find the font disturbing for this code, big caps and caps are very unreadable for this.

pigsfromagun
Posts: 12
Joined: Wed Nov 03, 2010 3:50 pm UTC

Re: 1188: "Bonding"

Postby pigsfromagun » Wed Mar 20, 2013 4:27 am UTC

gormster wrote:I remember when this site used to have comics on it.

This is a comic, regardless of whether or not it's funny to you in particular. If you knew Java, you would probably find humor in that code (because trust me: it's humorous). There have always been jokes on xkcd that are not accessible without some specific knowledge - this just happens to be one of those.

CasualSax
Posts: 63
Joined: Wed Mar 28, 2007 6:27 am UTC

Re: 1188: "Bonding"

Postby CasualSax » Wed Mar 20, 2013 4:28 am UTC

I don't really get the humor of this one, and I know Java. Meh.

jpk
Posts: 607
Joined: Sat Nov 13, 2010 7:33 am UTC

Re: 1188: "Bonding"

Postby jpk » Wed Mar 20, 2013 4:40 am UTC

Is it funny because he wrote bad code and ha, ha, java, or is it funny because he's writing code about a parent bonding with a kid by playing ball, or is it funny because what? Oddly enough, in the secondary joke he seems to be blaming his confusion on Eclipse - is that the funny? If so, why?

Count me among the lost on this one. I'm pretty sure I could point out all of the Java mistakes, but that doesn't seem to me especially hilarious. I write all my Java in vi, so I can point and snigger at Eclipse, but that's boring too. Anyone want to dissect this frog for the rest of us?

User avatar
tibfulv
Posts: 49
Joined: Tue Nov 27, 2012 11:31 am UTC

Re: 1188: "Bonding"

Postby tibfulv » Wed Mar 20, 2013 4:43 am UTC

CasualSax wrote:I don't really get the humor of this one, and I know Java. Meh.


Amongst others, it's a pun. The try-throw-catch sequence is a way to handle errors in Java IIRC.

LordKraken
Posts: 2
Joined: Wed Mar 20, 2013 4:34 am UTC

Re: 1188: "Bonding"

Postby LordKraken » Wed Mar 20, 2013 4:45 am UTC

Man, I loved this. I'm up coding and took a break to read xkcd. Wonderful.

I wrote the program up for the hell of it. Aside from the obvious boilerplate ( like wrap in class{ } ), the only change I needed was that 'throw Ball' has to be 'throw new Ball()'. This is sort of funny in and of itself, since rather the throw the ball back and forth, each time the parent or kid catch the ball he or she tosses it away and pulls a new one out of their pocket to throw.

I also hate eclipse, so there's that.

Salbeira
Posts: 1
Joined: Wed Mar 20, 2013 4:37 am UTC

Re: 1188: "Bonding"

Postby Salbeira » Wed Mar 20, 2013 4:46 am UTC

Must ... resist ... losing ... control ... aaaaah!
JAVA CODING CONVENTIONS!

Code: Select all

private class Ball extends Throwable {}
public class Person{
    private Person target;
    public Person(){
        this.target = null;
    }
    public Person(Person target){
        this.target = target;
    }
    public void aim(Ball ball){
        try {
            throw ball;
        } catch (Ball b) {
            this.target.aim(b);
        }
    }
    public void setTarget(Person target){
        this.target = target;
    }
    public Person getTarget(){
        return this.target;
    }
    public static void main(String[] args){
        Person parent = new Person();
        Person child = new Person(parent);
        parent.setTarget(child);
        parent.aim(new Ball());
    }
}


Aaah ... seeing this calms my racing heart ... and I didn't even wrote Java Doc for every method and refrained from declaring every variable that never gets changed as "final" ...

jpk
Posts: 607
Joined: Sat Nov 13, 2010 7:33 am UTC

Re: 1188: "Bonding"

Postby jpk » Wed Mar 20, 2013 4:48 am UTC

tibfulv wrote:
CasualSax wrote:I don't really get the humor of this one, and I know Java. Meh.


Amongst others, it's a pun. The try-throw-catch sequence is a way to handle errors in Java IIRC.


Yes, it is. And "Throwable" is a superclass of things that can be "thrown", like Exceptions... So he's just pointing out that Java uses an extended metaphor in its error handling? And that you could possibly come up with namespace conflicts around that metaphor, if you really, really tried to?

Sigh...

User avatar
da Doctah
Posts: 983
Joined: Fri Feb 03, 2012 6:27 am UTC

Re: 1188: "Bonding"

Postby da Doctah » Wed Mar 20, 2013 4:49 am UTC

tibfulv wrote:
CasualSax wrote:I don't really get the humor of this one, and I know Java. Meh.


Amongst others, it's a pun. The try-throw-catch sequence is a way to handle errors in Java IIRC.
Finally!

Sir_Read-a-Lot
Posts: 30
Joined: Wed May 25, 2011 4:50 am UTC

Re: 1188: "Bonding"

Postby Sir_Read-a-Lot » Wed Mar 20, 2013 4:52 am UTC

It's also a pun on parent and child classes.

I find it charming, if slightly silly.

WindyB
Posts: 1
Joined: Wed Mar 20, 2013 4:56 am UTC

Re: 1188: "Bonding"

Postby WindyB » Wed Mar 20, 2013 4:58 am UTC

Is it just me, or is the child and parent just throwing the ball to themselves?

The parent goes "throw ball, catch ball, tell child to aim, child throws, child catches, tells parent to aim..." so it's hardly a game of catch!

kateract
Posts: 5
Joined: Wed Nov 03, 2010 6:30 pm UTC

Re: 1188: "Bonding"

Postby kateract » Wed Mar 20, 2013 5:05 am UTC

This makes me smile, because none of the code is technically wrong; it's just bad style. Creating an infinite exception loop simply to throw a ball back and forth seems like overkill, but at least the ball makes it to the kid and back.

Solid_Kalium
Posts: 2
Joined: Wed Mar 20, 2013 5:05 am UTC

Re: 1188: "Bonding"

Postby Solid_Kalium » Wed Mar 20, 2013 5:07 am UTC

I'm terrified! They just keep throwing the ball! Let it stop! Let it stop!

User avatar
tibfulv
Posts: 49
Joined: Tue Nov 27, 2012 11:31 am UTC

Re: 1188: "Bonding"

Postby tibfulv » Wed Mar 20, 2013 5:14 am UTC

jpk wrote:
tibfulv wrote:
CasualSax wrote:I don't really get the humor of this one, and I know Java. Meh.


Amongst others, it's a pun. The try-throw-catch sequence is a way to handle errors in Java IIRC.


Yes, it is. And "Throwable" is a superclass of things that can be "thrown", like Exceptions... So he's just pointing out that Java uses an extended metaphor in its error handling? And that you could possibly come up with namespace conflicts around that metaphor, if you really, really tried to?

Sigh...


It's not quite that bad. He's actually writing a story about a parent bonding with their child, using Java error code as the language. I remember making silly code like that, too.

Two programming jokes in a row, though? That's evil. :twisted:
Last edited by tibfulv on Wed Mar 20, 2013 5:17 am UTC, edited 2 times in total.

Ignitus
Posts: 22
Joined: Fri Jul 02, 2010 8:48 pm UTC

Re: 1188: "Bonding"

Postby Ignitus » Wed Mar 20, 2013 5:14 am UTC

I'm finding the humor in this one hard to understand. I'm sure I'm just being over analytical of the source code. I fear the stdout stack traces of recursive exceptions.

tentative
Posts: 3
Joined: Wed Apr 01, 2009 7:55 pm UTC

Re: 1188: "Bonding"

Postby tentative » Wed Mar 20, 2013 5:17 am UTC

Would've been funnier if the metaphor wasn't broken by the content.
parent and child aren't aiming and throwing a Ball for each other to catch.
Rather, each is throwing and catching a Ball, then handing it to the other (until stack depth is exceeded).

A possible fix:

Code: Select all

class Ball extends Throwable {}
public class P {
   P target;
   P(P target) {
      this.target = target;
   }
   void aim() throws Ball {
      try {
         target.aim();
      }
      catch (StackOverflowError e) {
         throw new Ball();
      }
      catch (Ball b) {
         throw b;
      }
   }
   public static void main(String[] args) {
      P parent = new P(null);
      P child = new P(parent);
      parent.target = child;
      try {
         parent.aim();
      }
      catch (Ball b) {
         System.exit(0);
      }
   }
}


A fix more faithful to the metaphor would require messing with the stack,
but I don't know if that's possible in Java.
Now, if this was python...

ghrist8p
Posts: 1
Joined: Wed Mar 20, 2013 5:18 am UTC

Re: 1188: "Bonding"

Postby ghrist8p » Wed Mar 20, 2013 5:40 am UTC

So I wrote the code in, and then I ran it, and it felt funny imagining the parent and the child passing a Ball to each other. Then I thought the more the merrier so I wrote this:

Code: Select all

    public static void main( String[] args )
    {
        P parent = new P( null );
        P child = new P( parent );
        P brother = new P( child );
        P sister = new P( brother );
        parent.target = sister;
        parent.aim( new Ball() );
    }

but then I thought

Code: Select all

    public static void main( String[] args )
    {
        P[] familyMembers  = new P[ NUMBER_OF_FAMILY_MEMBERS];
        familyMembers[0] = new P( null );
        for( int i = 1; i < familyMembers.length; ++i )
        {
            familyMembers[i] = new P( familyMembers[i-1] );
        }
        familyMembers[ familyMembers.length - 1 ].target = familyMembers[0];
        familyMembers[0].aim( new Ball() );
    }

or even

Code: Select all

    public static void main( String[] args )
    {
        P[] familyMembers  = new P[ NUMBER_OF_FAMILY_MEMBERS];
        familyMembers[0] = new P( null );
        for( int i = 1; i < familyMembers.length; ++i )
        {
            familyMembers[i] = new P( familyMembers[i-1] );
        }
        familyMembers[ familyMembers.length - 1 ].target = familyMembers[0];
        familyMembers[0].aim( new Ball() );
        familyMembers[ familyMembers.length / 2 ].aim( new Ball() );
    }

Fire Brns
Posts: 1114
Joined: Thu Oct 20, 2011 2:25 pm UTC

Re: 1188: "Bonding"

Postby Fire Brns » Wed Mar 20, 2013 5:44 am UTC

pigsfromagun wrote:
gormster wrote:I remember when this site used to have comics on it.

This is a comic, regardless of whether or not it's funny to you in particular. If you knew Java, you would probably find humor in that code (because trust me: it's humorous). There have always been jokes on xkcd that are not accessible without some specific knowledge - this just happens to be one of those.

Gormster's statement was more likely a joke than a criticism. The fact that not 3 comics ago 1185 was a coding joke may have prompted the statement. Once I saw the explanation I got the humor of it but I'm not sure how many xkcd readers know how to code or if so then all the codes that Randal uses.
Pfhorrest wrote:As someone who is not easily offended, I don't really mind anything in this conversation.
Mighty Jalapeno wrote:It was the Renaissance. Everyone was Italian.

teelo
Posts: 782
Joined: Thu Apr 08, 2010 11:50 pm UTC

Re: 1188: "Bonding"

Postby teelo » Wed Mar 20, 2013 7:21 am UTC

Java infinite loops are so funny.

User avatar
unlimitedbacon
Posts: 5
Joined: Sat Feb 19, 2011 4:23 am UTC

Re: 1188: "Bonding"

Postby unlimitedbacon » Wed Mar 20, 2013 7:37 am UTC

I never really got my head around object oriented programming.

This is not encouraging.

RunasSudo
Posts: 6
Joined: Wed Mar 20, 2013 7:46 am UTC

Re: 1188: "Bonding"

Postby RunasSudo » Wed Mar 20, 2013 7:48 am UTC

Aah, reminds me of my days of writing retarded programs about exploding Cow objects...

Gargravarr
Posts: 74
Joined: Mon Dec 21, 2009 8:34 am UTC

Re: 1188: "Bonding"

Postby Gargravarr » Wed Mar 20, 2013 8:02 am UTC

Play with me Daddy, forever and ever and ever and... until StackOverflowError

Luckily, the code won't even compile. ALLCAPS is not valid java.

User avatar
drachefly
Posts: 197
Joined: Thu Apr 23, 2009 3:25 pm UTC

Re: 1188: "Bonding"

Postby drachefly » Wed Mar 20, 2013 8:37 am UTC

LordKraken wrote:Man, I loved this. I'm up coding and took a break to read xkcd. Wonderful.

I wrote the program up for the hell of it. Aside from the obvious boilerplate ( like wrap in class{ } ), the only change I needed was that 'throw Ball' has to be 'throw new Ball()'. This is sort of funny in and of itself, since rather the throw the ball back and forth, each time the parent or kid catch the ball he or she tosses it away and pulls a new one out of their pocket to throw.


Nope. You can throw the same ball over and over again. Ball is just Throwable, not an Exception, so it's not like you need to make a new one to reinitialize the stack trace or anything.

Did you even try it with the 'throw Ball' as written?

As for the sequence of events, well, there's no way to get a try/catch to be executed in methods attached to two different objects, so at some point something is going to have to give way and be done by the 'wrong' person. Even if you do everything in Ball and rephrase everything in passive voice.

TheEngineer
Posts: 49
Joined: Wed Nov 24, 2010 2:40 pm UTC

Re: 1188: "Bonding"

Postby TheEngineer » Wed Mar 20, 2013 8:58 am UTC

Public Announcement - Bonding.Net 1.0 Released Today!

Code: Select all

using System;

namespace Bonding
{
   class Ball : Exception{}
   class P
   {
      public P Target{ get; set; }
      public P( P target )
      {
         this.Target = target;
      }
      
      void Aim( Ball ball )
      {
         try
         {
            throw ball;
         }
         catch( Ball B )
         {
            Target.Aim( B );
         }
      }
      
      public static void Main(string[] args)
      {
         P Parent = new P( null );
         P Child = new P( Parent );
         Parent.Target = Child;
         Parent.Aim( new Ball() );
      }
   }
}


(I have absolutely no idea why I just did that)

User avatar
krunk4ever
Posts: 1
Joined: Wed Mar 20, 2013 9:41 am UTC

Re: 1188: "Bonding"

Postby krunk4ever » Wed Mar 20, 2013 9:47 am UTC

lpvb wrote:I'm guessing this program never halts?


In a perfect world, you'd be correct. But you'll eventually hit a java.lang.OutOfMemoryError exception in the real world. ;)

Wolfzoon
Posts: 1
Joined: Wed Mar 20, 2013 9:45 am UTC

Re: 1188: "Bonding"

Postby Wolfzoon » Wed Mar 20, 2013 9:55 am UTC

ghrist8p wrote:So I wrote the code in, and then I ran it, and it felt funny imagining the parent and the child passing a Ball to each other. Then I thought the more the merrier so I wrote this:

Code: Select all

...
        familyMembers[0].aim( new Ball() );
        familyMembers[ familyMembers.length / 2 ].aim( new Ball() );
    }

I'm pretty sure Java works procedurally and doesn't start a new thread upon throwing.
So this doesn't have the effect of having "two balls going around at the same time" as you might expect. It simply never reaches the second line.

wingphil
Posts: 2
Joined: Wed Mar 20, 2013 10:23 am UTC

Re: 1188: "Bonding"

Postby wingphil » Wed Mar 20, 2013 10:26 am UTC

Code: Select all

class Ball extends Throwable {
}

public class Person {
    private Person prev;
    private Person next;
    private Ball ball;

    public Person() {
        prev = null;
        next = null;
        ball = null;
    }

    public Person(Person prev) {
        setPrev(prev);
        ball = null;
    }

    public void recieveBall() {
        try {
            prev.throwBall();
        } catch (Ball b) {
            this.ball = b;
            next.recieveBall();
        }
    }

    public void throwBall() throws Ball {
        Ball b = ball;
        ball = null;
        throw b;
    }

    public void setPrev(Person prev) {
        this.prev = prev;
        prev.next = this;
    }

    public void giveBall(Ball b) {
        this.ball = b;
    }

    public static void main(String[] args) {
        Person parent = new Person();
        Person child = new Person(parent);
        parent.setPrev(child);
        parent.giveBall(new Ball());
        child.recieveBall();
    }
}



How about this? It's a bit wordier, but at least now the parent throws the ball to the child and then the child throws it back to the parent, without any weird handoffs or throwing it to yourself.

nigenet
Posts: 35
Joined: Wed Jul 01, 2009 10:27 am UTC
Location: Sunny Buxton, Derbyshire, UK (Where the water comes from)
Contact:

Re: 1188: "Bonding"

Postby nigenet » Wed Mar 20, 2013 10:30 am UTC

Gargravarr wrote:Play with me Daddy, forever and ever and ever and... until StackOverflowError

Luckily, the code won't even compile. ALLCAPS is not valid java.


Where does it say this is java? Could be a previously unencountered object-oriented version of COBOL... ;-)
"Your mother ate my dog!"
"Not all of him..."

orukusaki
Posts: 1
Joined: Wed Mar 20, 2013 10:29 am UTC

Re: 1188: "Bonding"

Postby orukusaki » Wed Mar 20, 2013 10:37 am UTC

The main problem with the code is the comic, as others have pointed out, is that the ball is not actually thrown between players. The players take turns throwing and catching the same ball.

Here's my version, in which the ball is actually thrown between players, until the stack overflows (excuse my poor Java skills, I'm a PHP man):
I'm most proud of the line "public void throwBall() throws Ball" :)

Code: Select all

import java.lang.StackOverflowError;

class Ball extends Throwable {}

class P
{
    Ball ball = null;
    String name;

    public P(String name)
    {
        this.name = name;
    }

    public void play(P target)
    {
        if (ball != null) {
            out("I have the ball, inviting " + target + " to play.");
            target.play(this);
            return;
        }

        try {
            out("Throw me the ball");
            target.throwBall();

        } catch (Ball b) {

            ball = b;
            out("I caught the ball.");
            target.play(this);
        }
    }

    public void throwBall() throws Ball
    {
            Ball b = ball;
            ball = null;
            out("Throwing the ball");

            throw b;
    }

    public static void main(String args[])
    {
        P parent = new P("Parent");
        P child = new P("Child");

        parent.ball = new Ball();
        try {
            parent.play(child);
        } catch (StackOverflowError $e) {
            System.out.println("That's enough bonding for one day.");
        }
    }

    private void out(String s)
    {
        System.out.println(name + ": " + s);
    }
}

User avatar
peewee_RotA
Posts: 504
Joined: Mon Dec 12, 2011 1:19 pm UTC

Re: 1188: "Bonding"

Postby peewee_RotA » Wed Mar 20, 2013 10:39 am UTC

I'm mostly disappointed that he apparently prefers cuddling brackets. I wonder if the child's mother approves of that!

But anyway, as you can see I love these types of jokes:

http://thepunking.wordpress.com/2011/11 ... ric-types/
http://thepunking.wordpress.com/2011/06 ... -and-ieye/
http://thepunking.wordpress.com/2012/02/22/folk-songs/
"Vowels have trouble getting married in Canada. They can’t pronounce their O’s."

http://timelesstherpg.wordpress.com/about/

Kit.
Posts: 1117
Joined: Thu Jun 16, 2011 5:14 pm UTC

Re: 1188: "Bonding"

Postby Kit. » Wed Mar 20, 2013 10:56 am UTC

I'm not getting the part about Eclipse. Does it crash while trying to parse this code or what?

User avatar
SeySayux
Posts: 14
Joined: Sun Apr 01, 2012 7:35 pm UTC

Re: 1188: "Bonding"

Postby SeySayux » Wed Mar 20, 2013 11:06 am UTC

To protect all that is Good and Holy, here is the non-aneurism inducing version.

Code: Select all

class Ball {};

class P {
public:
    P(P& target) : mTarget(&p) {}
    P(const P&) = delete;
    const ~P() = default;   

    void aim(const Ball&) const;

    P& operator=(const P&) = delete;

    P& target() {
        return *mTarget;
    }

    void setTarget(P& p) {
        mTarget = &p;
    }
private:
    P* mTarget;
};

void P::aim(const Ball& ball) const {
    try {
        throw ball;
    } catch(const Ball& b) {
        mTarget->aim(b);
    }
}

int main() {
    P parent;
    P child(parent);
    parent.setTarget(child);
    parent.aim(Ball());
}


Still, the circular reference is cringe-worthy.

Also, can somebody please make up some reason to use extremely convoluted templates here?

loosescrews
Posts: 1
Joined: Wed Mar 20, 2013 11:33 am UTC

Re: 1188: "Bonding"

Postby loosescrews » Wed Mar 20, 2013 11:37 am UTC

Given the suffix on Throwable, shouldn't it be an interface?

HarpyRotter
Posts: 6
Joined: Wed Mar 20, 2013 11:16 am UTC

Re: 1188: "Bonding"

Postby HarpyRotter » Wed Mar 20, 2013 11:46 am UTC

drachefly wrote:
LordKraken wrote:Man, I loved this. I'm up coding and took a break to read xkcd. Wonderful.

I wrote the program up for the hell of it. Aside from the obvious boilerplate ( like wrap in class{ } ), the only change I needed was that 'throw Ball' has to be 'throw new Ball()'. This is sort of funny in and of itself, since rather the throw the ball back and forth, each time the parent or kid catch the ball he or she tosses it away and pulls a new one out of their pocket to throw.


Nope. You can throw the same ball over and over again. Ball is just Throwable, not an Exception, so it's not like you need to make a new one to reinitialize the stack trace or anything.


what

Dude, it's in class Throwable where the stack trace is initialized, not in class Exception, so your point doesn't even make sense. Note also that simply re-throwing the throwable does not add to the stack trace, but that's just some trivia.

drachefly wrote:As for the sequence of events, well, there's no way to get a try/catch to be executed in methods attached to two different objects, so at some point something is going to have to give way and be done by the 'wrong' person.


wut

If you mean there's no way to get a try/catch to finish its execution normally, then you're right (but it sure as hell doesn't seem you wanted to say that).

Nothing "is going to have to give way and be done by the 'wrong' person", the program will simply loop until the stack exceeds its limit and a StackOverflowException is thrown. This stack in particular is the one kept internally by the main thread to allocate local variables, for example, but more importantly to keep track of the memory address to return to when returning from a method call. This never happens normally because the stack is being filled with more and more address pointers (pointing to something like the line "target.aim(b);") until it eventually reaches its limit and an abrupt return occurs due to the StackOverflowException being thrown.

User avatar
BAReFOOt
Posts: 179
Joined: Mon Jul 19, 2010 7:48 am UTC

Re: 1188: "Bonding"

Postby BAReFOOt » Wed Mar 20, 2013 12:37 pm UTC

LordKraken wrote: the only change I needed was that 'throw Ball' has to be 'throw new Ball()'.


Uuum, no. aim gets the ball (lowercase!) via its parameter, and main already passes it a new Ball(). They pass the same Throwable back and forth.


Return to “Individual XKCD Comic Threads”

Who is online

Users browsing this forum: Google [Bot] and 62 guests