Jump to content

[kOS] The Automated Mission Challenge


Recommended Posts

ILCiI70.png

jpaverly. Check out his site here: http://jpvalery.com

Epic mission patch by

The Automated Mission Challenge

Story:

Lately the science division of the KSC has been doing research into something commonly known as the speed of light. Their research suggests that data transmissions over long distances do not, in fact, take place instantly, and that transmissions to far parts of the system might take more than 10 minutes. This would certainly explain the mysterious loss of every single deep space probe launched by the KSC, as all these probes were designed to be controlled via a direct uplink with mission control. Luckily, a solution for this most unfortunate problem has been found: computers!

Leading scientists theorize that if all commands are issued from within the craft itself then the lag time will be under a second and the craft won't crash or end up on extrasolar trajectories. Thus you have been put in charge of designing, building, testing, and launching the first completely autonomous mission in the history of kerbalkind. Good luck!

Challenge:

Build and launch a mission entirely controlled by kOS modules. This means that the only time you may directly control the craft is when you execute the mission code at launch (note that there are some exceptions). From that point on, you cannot touch the controls, though you can meticulously watch its trajectory in the map view and find cool camera angles during flight if you wish. The ultimate goal of this is to perform the most impressive autonomous mission possible. Note: you are allowed to run new programs once in orbit, but you may only do so from a stable orbit around any body, or while landed on any body. This is to simulate the effects of a lagged transmission, as the craft will need to be in a safe place while it waits for the new program to download. You are also permitted to use multiple launches to perform more complex missions.

Rules:

1. The only mod part allowed (and technically required) is the official kOS module, found here. You may also use Sensor Reporter, found here, if you so desire. All other parts must be stock. You may not have a kerbal onboard your craft(s) at any point during the mission.

2. You may not make any control inputs to a craft after launch, including (but not limited to) staging, fuel transfers, and docking/undocking. You may manually use timewarp.

3. You (meaning you yourself – does not apply to running programs) may only run new programs when the current one has ended and when the craft in question is either in a stable orbit or landed on a body. Note that you may also fire action groups during this time if and only if their sole function is to provide input to kOS. You may run as many kOS programs and/or commands as you want prior to liftoff.

3a: You may execute a command or program under any conditions if it is done so by the program found here. However there cannot be an active program.

4. Decoupling small probes and/or undocking/docking follow the same rules as the above. All control inputs must come from a kOS unit. Note that due to the inability of kOS to use docking ports, you may manually undock craft (rule 3 limitations apply).

5. You are allowed to modify the .cfg of a vanilla probe core to use kOS.

6. You may perform multiple launches, but once a craft leaves Kerbin orbit you may no longer launch new rockets. Also note that only the first craft to leave Kerbin orbit counts towards any points. Said craft should be assembled in Kerbin orbit and then may break apart later as part of its mission.

7. I retain full authority to change or add to the above rules at any time, and will be the final judge of whether or not an entry is fair or not.

Submission:

When submitting an entry you should include the following:

1. A screenshot of your vessel before launch.

2. Various screenshots of your vessel during its mission.

3. Map view screenshots confirming SOI and orbital information for point allocation.

4. Screenshots of landing on other bodies and/or returning to Kerbin.

5. A witty and thoughtful commentary/story for your adventure.

6. (Optional) Your craft file.

7. (Optional) The kOS code used. Do it for the community! :)

Note that 6 and 7 will become mandatory if anyone challenges the validity of your attempt, so that others can verify it. Also, unless challenged, all attempts will be considered valid if all required screenshots are included. Missing screenshots for points proof will result in the loss of those points, and may result in your entry not being scored at all. Also note that a video is considered sufficient to meet requirements 1, 2, and 3. Please be sure to include all required material when submitting an entry, so I can put your attempt in the leaderboards as soon as possible!

Good Luck!

Scoring:

Scoring is based off of a grading system. You can earn higher point values by scoring higher in a grade category. Grade points in the same category do not stack.

SOI Hunter:

1 point - Enter the SOI of one body (note that Kerbin does not count for this or any following SOI Hunter awards)

2 points - Enter the SOI of three bodies

3 points - Enter the SOI of five bodies

5 points - Enter the SOI of ten bodies

10 points - Enter the SOI of all bodies in the Kerbol system

Planet Orbiter:

1 point - Achieve a stable orbit around Kerbin

5 points - Achieve a stable orbit around Kerbin and one other planet

15 points - Achieve a stable orbit around Kerbin and two other planets

30 points - Achieve a stable orbit around Kerbin and four other planets

50 points - Achieve a stable orbit around Kerbin and all other planets

Planet Lander:

20 points - Land safely (kOS module intact) on a planet (Kerbin does not count)

30 points - Land safely on two planets

40 points - Land safely on three planets

50 points - Land safely on four planets

75 points - Land safely on all planets

Moon Orbiter:

1 point - Achieve a stable orbit around one moon

2 points - Achieve a stable orbit around two moons

5 points - Achieve a stable orbit around four moons

8 points - Achieve a stable orbit around six moons

15 points - Achieve a stable orbit around all the moons

Moon Lander:

10 points - Land safely (kOS module intact) on a moon

15 points - Land safely on two moons

30 points - Land safely on four moons

50 points - Land safely on six moons

65 points - Land safely on all moons

Return Home:

1 point - Return all kOS units to Kerbin after achieving orbit (note that they must touch/splash down and be "recoverable")

2 points - Return all kOS units to Kerbin after orbiting either the Mun or Minmus

5 points - Return all kOS units to Kerbin after landing on the Mun or Minmus

10 points - Return all kOS units to Kerbin after orbiting another planet

15 points - Return all kOS units to Kerbin after landing on another moon

20 points - Return all kOS units to Kerbin after landing on another planet

75 points - Return all kOS units to Kerbin after landing on at least 3 planets and 3 moons

Note that the maximum possible total points is 290 at this time.

Leaderboards:

1. 58 = Steven Mading

[=====] SOI Hunter: 2

[=====] Planet Orbiter: 5

[=====] Planet Lander: 20

[=====] Moon Orbiter: 1

[=====] Moon Lander: 10

[=======] Return Home: 20

2. 24 = adammanda

[=====] SOI Hunter: 1

[=====] Planet Orbiter: 1

[=====] Moon Orbiter: 2

[=====] Moon Lander: 15

[=======] Return Home: 5

3. (tie) 18 = Steven Mading

[=====] SOI Hunter: 1

[=====] Planet Orbiter: 1

[=====] Moon Orbiter: 1

[=====] Moon Lander: 10

[=======] Return Home: 5

3. (tie) 18 = sarkun

[=====] SOI Hunter: 1

[=====] Planet Orbiter: 1

[=====] Moon Orbiter: 1

[=====] Moon Lander: 10

[=======] Return Home: 5

4. 3 = adammanda

[=====] SOI Hunter: 1

[=====] Planet Orbiter: 1

[=====] Moon Orbiter: 1

5. 2 = Bobnova

[=====] SOI Hunter: 1

[=====] Planet Orbiter: 1

6. 1 = baloan

[=====] Planet Orbiter: 1

Bob Kerman's Wittiest Story Award: <whoever makes a considerably clever story/commentary for their mission gets this>

Honorable Mentions:

All the missions that did not make it into the leaderboards for one reason or another.

- bsalis: kOS-Controlled SSTO VTOL K-Prize Entry

Please let me know if any part of this challenge description is confusing, overly difficult to read, insulting, politically incorrect, or otherwise not satisfactory. I am always open to suggestions. :)

Edited by Thrfoot
Updated links
Link to comment
Share on other sites

I like the idea, but I have a few questions about the rules:

1 - Does the Mun count as "any body", for the sake of scoring or does it count as still being a child of the SOI of Kerbin (becauase the Mun's SOI is a pocket inside Kerbin's SOI maybe it still counts as being inside Kerbin's SOI, depending on how you wanted to look at it, and what you meant by the phrasing of it.

2 - You didn't explicitly mention Time Warp or Physics Warp in your list of exceptions that you are allowed to control manually. Are you allowed to time warp manually or do you have to have the KOS module do it? I'd prefer it to be manual. In a sense I don't even like the fact that KOS script can adjust time warp, because that's sort of breaking the fourth wall a bit. The Kerbal software engineers who wrote the code shouldn't even know there is such a thing as time warp. From their point of view it doesn't exist. Just like the camera angle.

3 - Lots of people have been sharing code back and forth with each other. That may make it difficult to really track down who gets the credit for a successful mission, but oh well, that really can't be helped.

Let's start the challenge.

Link to comment
Share on other sites

I suppose RemoteTech shouldn't be an issue. Just so long as it gives you no advantage over a stock player you should be fine. :)

Ok cool, as it stands now, I don't think it does give an advantage, maybe more of a disadvantage. Maybe once the flight computer is released that'll be another story.

Link to comment
Share on other sites

3. You may only run new programs when the current one has ended and when your craft is either in a stable orbit, or landed on a body.

Can I have a program run another program? For example my orbital ascent script is in two parts, one to get it out of the athmo, at which point the program will call my circularizing program and pass some parameters to it. I figure this is fine since I'm not doing anything, but I s'pose I can mash them together if need be, since even combined the file should be below 10k.

1 point: Enter the SOI of any body (excluding Kerbol).

I'll have to get back to you on this, I have a probe en route to Jool, but the game can't decide if I'm getting an encounter or not, keeps going back and forth whenever I check it, damn rounding errors. ("slightly" failed orbital attempt, circu-burn never ended... that'll teach me to use long range probes for Kerbin orbit testing... :cool: oh, and does un-intentional stuff even count? )

I did do an Apollo 13 style mission (prematurely staged munar-injection booster playing the part of the meteorite/explosion) going round the moon and landing back on Kerbin, but I don't think it counts, because while it was supposed to be automated, due to the explosive mishap it turned into more of a semi-automatic mission, with me typing up new programs and running the occasional command during the flight. Zero direct control input though, everything done via kOS commands (soo, 1/10th of a point? :sticktongue: ), also the reason why I have no screenshots, was too busy typing to think about beauty shots. :(

Ok cool, as it stands now, I don't think it does give an advantage, maybe more of a disadvantage. Maybe once the flight computer is released that'll be another story.

Since you'll be running the show with kOS, I don't think the RT flight comp will affect things much, unless of course kOS is able to send parameters to RT flight comp, but as I understand it, that isn't the case.

I'll need to throw some mission together for this challenge, might take a bit though. Playing with RT and Nazari's Traditional Tech-tree (bit confusing with choice-directions at times, but quite nice) is slowing me down a bunch, needing to fly around was fun but it's starting to get a bit tedious (and with Kerbin blocking my science transmissions, I can't abuse them grrr :wink: ). I miss space, can't get to orbit yet, manned are too heavy and probes lose contact before making it up :blush: I need to build and transport some command centers around Kerbin so I can get my satellite network up (after which I wont need the command centers on the ground :huh: )

Speaking of which, I should probably stop rambling and get back to that, so I can eventually partake in this challenge :)

Link to comment
Share on other sites

Can I have a program run another program? For example my orbital ascent script is in two parts, one to get it out of the athmo, at which point the program will call my circularizing program and pass some parameters to it. I figure this is fine since I'm not doing anything, but I s'pose I can mash them together if need be, since even combined the file should be below 10k.

I have the same question. The way it's phrased I *suspect* is not what Thrfoot meant. The way it's phrased it technically means you can't run two programs in parallel on two different SCS units either. I suspect the *intended* meaning is that the USER isn't allowed to manually type "run programname" from the terminal window until another has finished, but that a PROGRAM is allowed to run another program before it itself is finished.

For now I'm going to write my code as if calling a subprogram is allowed and hope that's what thrfoot meant. If it's not and I submit an attempt before it gets clarified, I'd like to reserve the right to re-submit an attempt with all the subprograms rolled into one.

Edited by Steven Mading
Link to comment
Share on other sites

Really wish I could enter this, but am still getting to grips with all the different variables available and learning all the syntax. Shouldn't be too hard to do as I have a fair bit of experience with programming, but it's always interesting learning a new language :D

It's still got lots of bugs but it is usable provided you keep abreast of what those bugs are. Doing "what would make sense to a programmer" often doesn't work. I recommend keeping up to date on the issues list on the github page for it to avoid falling into pitfalls.

Link to comment
Share on other sites

Scoring:

1 point: Enter the SOI of any body (excluding Kerbol).

3 points: Establish a stable orbit around any body (excluding Kerbol).

10 points: Perform a successful landing on any body (successful = the kOS module is still intact).

15 points: Return the spacecraft safely to Kerbin and recover the original kOS module.

Scoring is cumulative.

Just want to make sure, when you say Kerbol you mean the sun? So launching from Kerbin, we're already in its SOI so I guess that doesn't count, but establishing a stable Kerbin orbit would count I imagine.

Also after checking the points, I don't see that my KerboSync network would count for much, unless I take it to the Mun and deploy a network there too.

Since you'll be running the show with kOS, I don't think the RT flight comp will affect things much, unless of course kOS is able to send parameters to RT flight comp, but as I understand it, that isn't the case.

This is true I guess, being as that kOS may end up being the RT flight comp, at least as an option anyway. If that is the case then I guess it sort of puts those who use RT back on the same level as those who don't, so long as the mechjeb style flight comp isn't used.

Anyway, with my current kerbosync launch efforts it's giving me a flagrant error for some reason. Haven't tracked it down yet, but the code all seems to be fine, no missing periods or close brackets as far as I can tell.

Edit:

This must be the problem

print "Apoapsis of " + apoapsis + "has been reached, cutting throttle." at (8,3).

Seems I remember reading something about this but forgot what it was. I guess it doesn't like variables in the middle of a print statement like that.

Odd though because it works when I type it in the terminal, but not programmatically. I also counted the characters and it seems it would go over 50 with the apoapsis in there so maybe that also has something to do with it.

Edited by Sma
Link to comment
Share on other sites

Can I have a program run another program? For example my orbital ascent script is in two parts, one to get it out of the athmo, at which point the program will call my circularizing program and pass some parameters to it.
I have the same question. The way it's phrased I *suspect* is not what Thrfoot meant. The way it's phrased it technically means you can't run two programs in parallel on two different SCS units either. I suspect the *intended* meaning is that the USER isn't allowed to manually type "run programname" from the terminal window until another has finished, but that a PROGRAM is allowed to run another program before it itself is finished.

Steven Mading is right, I intended to say the user can't do something like manually end the program and start a new one, and that new manually started programs cannot be run until in a stable orbit or landed on a body. If a program runs another program as a part of its programming, then for all intents and purposes it is just one big program. So yes, you can start another program from an already running program. :)

Leme go rephrase that in the main post for clarity.

Just want to make sure, when you say Kerbol you mean the sun? So launching from Kerbin, we're already in its SOI so I guess that doesn't count, but establishing a stable Kerbin orbit would count I imagine.

Yes, Kerbol is basically the Sun (I prefer using Kerbol, and the Kerbol system to describe the local star system), and establishing a stable orbit around Kerbin does count. Since you are already in Kerbin's SOI there is no "entering" to be done and thus no extra points. Hope that helped clarify. :)

Edited by Thrfoot
Link to comment
Share on other sites

So yes, you can start another program from an already running program. :)

Figured as much, just thought it best to make sure :)

Oh, any thoughts on how we go about proving our claimed feats? We going with an honor system, screenshots, fraps, save file & program, or what? :rolleyes:

I'll have to get back to you on this, I have a probe en route to Jool, but the game can't decide if I'm getting an encounter or not

Yeah, it now seems to be missing Jool and heading to Kerbol, oh well. :sealed:

I need to build and transport some command centers around Kerbin

Yeah this was a stupid idea, damn thing can't go past Mach 3 without disintegrating and I'm not patient enough to fly it half way round Kerbin at a pedestrian Mach 2 :huh:

I'll have to sort something out, I don't need these delays, I have challenges to complete! :cool:

Link to comment
Share on other sites

This must be the problem

print "Apoapsis of " + apoapsis + "has been reached, cutting throttle." at (8,3).

Seems I remember reading something about this but forgot what it was. I guess it doesn't like variables in the middle of a print statement like that.

This thread should probably be kept clear of KOS syntax problems so it's just about the challenge.

But, that being said, check to see if the length of the string goes past the right edge of the terminal window. It looks long enough that it might if you start it at column 8. That's a known problem with PRINT AT. Regular PRINT is able to wrap text at the edge of the screen, but PRINT AT isn't, and it causes KOS to overflow an array. It's supposedly fixed already in github, but not in the released version.

Link to comment
Share on other sites

The challenge is a Great Idea!

Question:

1. How do I submit a candidate? Post the code? Post screenshots?

Comment:

2. Interplanetary transfers are dependent on the timing and where the planets are. I am not sure how planets and moons are located in a new game but to make sure the script does not rely on those externally given timings I'd ask all contenstants' scripts to start only after a wait random(sidereal rotation period of the target planet/moon), random(...) providing a number between 1 and the argument. That way the target body will be in an arbitrary position on its orbit when the script starts.

3. I disagree on the use of warp when its only use is to bridge thrustless time between two maneuver burns. As long as it is transparent to Kerbal engineers whether a wait passes the time or actually warps there. In my scripts you could replace warpfor(dt) by wait dt and the behavior wouldn't change - just the real time to get there.

4. Does it make sense to add a "Docking" challenge?

Edited by baloan
Link to comment
Share on other sites

1. How do I submit a candidate? Post the code? Post screenshots?

because I'd like to submit my ltoa (launch to orbit, atmosphere) script. The script uses various subroutines from my mission toolkit - is that an issue?

and claim 3 points: Establish a stable orbit around any body (excluding Kerbol) for reaching an orbit around Kerbin.

Link to comment
Share on other sites

Question:

1. How do I submit a candidate? Post the code? Post screenshots?

Build a rocket to execute your code, and submit screenshots of you performing the mission with said rocket. Map view screenshots are necessary to prove that you have entered either a stable orbit or the SOI of another object. I'll add this to the main post so others know what to do as well. Not sure how I forgot to add this. :P

Comment:

2. Interplanetary transfers are dependent on the timing and where the planets are. I am not sure how planets and moons are located in a new game but to make sure the script does not rely on those externally given timings I'd ask all contenstants' scripts to start only after a wait random(sidereal rotation period of the target planet/moon), random(...) providing a number between 1 and the argument. That way the target body will be in an arbitrary position on its orbit when the script starts.

I'm not sure this is necessary or not. It should be possible for engineers to set up a hardcoded maneuver using pre-calculated burns (they did this for Apollo, right?), so I'm not sure the code necessarily has to be dynamic. I might add bonus points if it is though. :)

3. I disagree on the use of warp when its only use is to bridge thrustless time between two maneuver burns. As long as it is transparent to Kerbal engineers whether a wait passes the time or actually warps there. In my scripts you could replace warpfor(dt) by wait dt and the behavior wouldn't change - just the real time to get there.

Currently warp is the only thing you are allowed to control manually during program execution. You can choose to do it yourself or have your program do it for you. I'm not entirely sure what point you are trying to argue here.

4. Does it make sense to add a "Docking" challenge?

I'm not sure this is reasonably possible with the current version of kOS. I could be wrong though, as I'm no expert. If someone manages to pull it off, I'll add a point reward for it.

Link to comment
Share on other sites

Currently warp is the only thing you are allowed to control manually during program execution. You can choose to do it yourself or have your program do it for you. I'm not entirely sure what point you are trying to argue here.

Misunderstanding on my side: I thought warp was not allowed in scripts.

Link to comment
Share on other sites

2. Interplanetary transfers are dependent on the timing and where the planets are. I am not sure how planets and moons are located in a new game but to make sure the script does not rely on those externally given timings I'd ask all contenstants' scripts to start only after a wait random(sidereal rotation period of the target planet/moon), random(...) providing a number between 1 and the argument. That way the target body will be in an arbitrary position on its orbit when the script starts.

It's not a bad idea but the only way to really prove that it's using that is to run the entire thing twice under two different settings. And that means twice as much mucking around with screenshots or video captures.

3. I disagree on the use of warp when its only use is to bridge thrustless time between two maneuver burns. As long as it is transparent to Kerbal engineers whether a wait passes the time or actually warps there. In my scripts you could replace warpfor(dt) by wait dt and the behavior wouldn't change - just the real time to get there.

Well there's two different parts of what I said. One is that I don't think it's necessary to *require* that the script perform the timewarps for a submission, as to a certain extent that decision is driven by the boredom of the player not the needs of the script, and as long as you're just drifting it shouldn't change anything whether you time warped or not, therefore it should be treated the same as the camera angle - not relevant to the correctness of the script program so go ahead and do it manually if you want. Sometimes I want to watch. Sometimes I don't. Let me decide on a case-by-case basis instead of having to hardcode it in the script

The second part of what I said is that I dislike that it even exists at all because of breaking the fourth wall and that. That's really a second point and just my opinion, and not relevant to this contest. What's relevant to the contest is that I shouldn't *have* to do it that way, as it doesn't make the script any easier or harder to write. It just alters the boredom level of watching it.

4. Does it make sense to add a "Docking" challenge?

No RCS translation exits yet in KOS so that would be a HUGE challenge. You'd have to correct your drift by constantly rotating around and using the main engine to push left/right/up/down. And once you do dock. we don't have script control of the "undock" functionality.

Link to comment
Share on other sites

I'm not sure this is necessary or not. It should be possible for engineers to set up a hardcoded maneuver using pre-calculated burns (they did this for Apollo, right?), so I'm not sure the code necessarily has to be dynamic. I might add bonus points if it is though. :)

Also, there is no such thing as a random number function in KOSscript. Sure, you could homebrew one using the classic divide/remainder technique, but it's not natively there.

Link to comment
Share on other sites

Idea for how to submit.

What if the submission involved having to post up code files and a .craft file somewhere along with the screenshots? The proof that it's really the code is that someone else can download it and run it. (which means you'd also need instructions with it, like "run this program, then this one, then wait until X condition and run that one.")

The nice thing about that is that it would result in a nice repository of different examples after the contest is done.

(EDIT: I tend to prefer to indent my code well and comment it well, and as such I usually run it through a little perl script to strip comments and indents before running it on KOS which penalizes you for good style. This means I'd probably want to post both versions of the code - the stripped version to actually execute and the unstripped version so it's legible and you can read it. The unstripped version might not run because it would exceed 10kb.)

Edited by Steven Mading
Link to comment
Share on other sites

What if the submission involved having to post up code files and a .craft file somewhere along with the screenshots? The proof that it's really the code is that someone else can download it and run it. (which means you'd also need instructions with it, like "run this program, then this one, then wait until X condition and run that one.")

The nice thing about that is that it would result in a nice repository of different examples after the contest is done.

Check the main post again. I sort of already did this. It's only optional, however, to post your code and craft file unless someone challenges your claim. I don't want to force people to make their code and craft public if for some strange reason they don't want to. Regardless I fully expect everyone to put up their code and craft files. *peer pressure* :P

(EDIT: I tend to prefer to indent my code well and comment it well, and as such I usually run it through a little perl script to strip comments and indents before running it on KOS which penalizes you for good style. This means I'd probably want to post both versions of the code - the stripped version to actually execute and the unstripped version so it's legible and you can read it. The unstripped version might not run because it would exceed 10kb.)

Nobody's stopping you from uploading a well-commented version or a non-commented version. If you have a more legible version of your code then by all means, share it with us! :)

can you change the rules so mods are allowed? they dont give that big a advantage at all, unlike what most people think.

The enforced use of stock parts simplifies the verification of entries (if necessary). If any mods were allowed then it would become very complicated to verify things as I would have to download every mod the user had on the craft in order to load and test it myself. I am not against mods (I have around 10 myself), it just doesn't make sense for this challenge. I hope you understand. :)

Edited by Thrfoot
Link to comment
Share on other sites

This thread should probably be kept clear of KOS syntax problems so it's just about the challenge.

But, that being said, check to see if the length of the string goes past the right edge of the terminal window. It looks long enough that it might if you start it at column 8. That's a known problem with PRINT AT. Regular PRINT is able to wrap text at the edge of the screen, but PRINT AT isn't, and it causes KOS to overflow an array. It's supposedly fixed already in github, but not in the released version.

True, didn't think about that (keeping it just about the challenge). I did figure it out eventually, sort of annoying but thats ok. :)

Link to comment
Share on other sites

can you change the rules so mods are allowed? they dont give that big a advantage at all, unlike what most people think.

I think it's fine the way it is. The idea I imagine is to stop people from using things like mech jeb, or modified engines/fuel tanks with insane power/fuel efficiency etc.

Link to comment
Share on other sites

This thread is quite old. Please consider starting a new thread rather than reviving this one.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...