Jump to content
Eternal Lands Official Forums
Guest dangph

FreeBSD Notes

Recommended Posts

Guest dangph

I finally figured out how to get Eternal Lands 112 to run on FreeBSD, so I thought I'd post some notes here for other FreeBSD users.

 

I did try the recommended method of building from CVS source, and it did build with "gmake -f Makefile.bsdg" (I had to add "-DBSD" to the end of the "OPTIONS" line for it to compile, BTW), but it didn't run; it just exited immediately with no error message.

 

So here an alternative method that worked for me. What to do:

 

1. Download and unzip the Linux version.

2. Run the linux binary: el.x86.linux.bin

3. That's all. It seems to work fine.

 

To get sound working (for the Linux version), I *think* you need to install audio/linux-openal from the ports tree. You may then need to specify a sound system in /usr/compat/linux/etc/openalrc . I have "(define devices '(arts))" because I use KDE. Search on the Internet for other possible values. I assume the sound is working on my machine because the music works (note: the music is a separate download). I haven't actually heard any sound effects yet, but judging by the contents of the "sound" directory, the game is virtually sound-free.

 

For reference, I'm running FreeBSD 6.0, and the following are all the ports I have on my system that have "linux" in the name.

 

$ pkg_info | grep linux

linux-XFree86-libs-4.3.99.902_5 XFree86 libraries, Linux binary

linux-alsa-lib-1.0.6.8_1 The Advanced Linux Sound Architecture libraries

linux-arts-1.3.0.4_1 Audio system for the KDE integrated X11 desktop (Linux vers

linux-atk-1.8.0_1 Accessibility Toolkit, Linux/i386 binary

linux-divx4linux-5.0.20030428_1 Linux binary release of DivX Codec

linux-esound-0.2.35 RPM of esound

linux-expat-1.95.7 Linux/i386 binary port of Expat XML-parsing library

linux-flashplugin-6.0r79_3 The official Macromedia Flash Player for Linux Mozilla and

linux-fontconfig-2.2.3_2 Linux/i386 binary of Fontconfig

linux-glib2-2.4.8_1 Version 2.X Linux/i386 binary port of GLib

linux-gtk2-2.4.14_1 GTK+ library, version 2.X, Linux binary

linux-jpeg-6b.33 RPM of the JPEG lib

linux-libaudiofile-0.2.6 RPM of audiofile

linux-libogg-1.1.2.2_1 Ogg bitstream library (Linux version)

linux-libvorbis-1.1.0.1_1 Audio compression codec library (Linux version)

linux-openal-0.0.0.2.20040726_1 A 3D positional spatialized sound library (Linux version)

linux-pango-1.6.0 Linux pango binary

linux-png-1.2.8 RPM of the PNG lib

linux-realplayer-10.0.6 Linux RealPlayer 10 from RealNetworks

linux-sdl-1.2.5_2 Cross-platform multi-media development API (linux version)

linux-sdl_image-1.2.4 A simple library to load images as SDL interfaces (linux ve

linux-tiff-3.6.1_5 TIFF library, Linux/i386 binary

linux_base-8-8.0_10 Base set of packages needed in Linux mode (for i386/amd64)

linux_dri-4.4.0 Binary Linux DRI libraries for 3D hardware acceleration of

linuxpluginwrapper-20051113 A wrapper allowing use of linux-plugins with native applica

linuxthreads-2.2.3_19 POSIX pthreads implementation using rfork to generate kerne

Share this post


Link to post
Share on other sites

I can run the native FreeBSD binary without problems..

Just gmake -f Makefile.bsd as you said dangph and make sure -DBSD is in it.

Also make sure that you dont compile with -DNEW_FRUSTUM..it segfaults for me.

When you have compiled it just put the binary in the directory where you unzipped the linux-package and run :D

Share this post


Link to post
Share on other sites
Guest san

Hi all,

 

I'm new to this game, haven't played it for a second, but it sounds fun and I thought let's try this on DesktopBSD 1.0 RC3 (== FreeBSD 5.4).

 

The first attempt I made was by using the Makefile.bsd (with gmake) but it compained about a lot of errors in the Makefile..

 

So I switched to the Makefile.bsdg which seemed a lot nicer..

I changed a few include/ifdef lines in the source to make sure that gmake uses sdtlib.h instead of malloc.h (in books.c and rules.c)

I just noticed adding a -DBSD to this line in the Makefile.bsdg should do the same:

OPTIONS=-DLINUX -DELC -DPNG_SCREENSHOT -DNETWORK_THREAD -DBSD

 

Because this line doesn't work (a whole lot of errors):

gmake -f Makefile.bsdg release

 

I compile the game with:

gmake -f Makefile.bsdg

 

When I start the game I get a segfault.. I do see a window popping up and the loading bar with a background but that's about it..

This is the error_log.txt.. It looks like some cal3d problem but I have cal3d (version 0.10.0) installed and cal3d-devel (version 0.11.0)

 

Any idea's how to build a valid FreeBSD binary? And why doesn't the team provide this? You guys know how it works.. and provide Makefiles...

 

Cheers,

San

 

PS. I will try the linux version on BSD but I really hope that this game will have a native BSD binary...

PPS. Hmm the linux version also segfaults.. will have to look further into this :D

Edited by san

Share this post


Link to post
Share on other sites

Are you sure that you have all the required files?

unzip the linux client zipfile from the el-website and try to run it from inside that directory.

Share this post


Link to post
Share on other sites
Guest san

Are you sure that you have all the required files?

unzip the linux client zipfile from the el-website and try to run it from inside that directory.

yes I'm pretty sure I do. I have installed the ports version and the linux update. I installed them both in /usr/local/games/el

 

But both the linux as the BSD version do segfault... :P

 

I removed the ports version and redownloaded the complete linux version..

placed the bsd executable in there and it works!!

 

sannie is in the game :D

 

Thanks for your fast reply Enki..

 

Cheers,

San

Edited by san

Share this post


Link to post
Share on other sites

Ok. I have had some problems with my nvidia driver when running linux-opengl apps as root.

After running certain linux apps the opengl quits working correctly and all applications trying to

use it (FreeBSD and linux ones) just segfaults.

 

I did the following:

rm /compat/linux/dev/nvidiactl

reboot

 

Then try to run el again as non-root

Hope it helps!

 

/Enki

Share this post


Link to post
Share on other sites

I have compiled the current CVS (that is, el-1.2.0 as it is) for my FreeBSD system. I don't know if the binary will work on other FreeBSD systems, but I suspect it has a chance. So I decided to put it online.

 

The thing is compiled on (and probably for :) ) FreeBSD 6-STABLE. Please, give me a call if it doesn't work and what the error is (I might just learn a bit). Also, if it works for you, let me know please!

 

Link: el.x86.bsd.bin

 

Put it in your EL-folder. It worked for me, as long as the folder is located as: /usr/local/games/el When located somewhere else, make sure your el.ini contains the right path.

Share this post


Link to post
Share on other sites

Some additional things:

  • -DNEW_FRUSTUM is pretty much needed to run the game and needs -DBUG_FIX_3D_OBJECTS_MIN_MAX. Symptoms if this isn't compiled: cursor offsets while trying to talk to npc's.
  • # OpenAL and Alut were split in ports
    .if defined(WITH_FREEALUT) || exists(/usr/local/bin/freealut-config)
    LDFLAGS+=`freealut-config --libs`
    .endif
     
  • If you've installed from port, -DAUTO_UPDATE is only useful after chmod -R g+w /usr/local/share/el (or playing as root, but eh.....indeed)
  • -DNEW_TEX is also safe and recommended :P
  • there's some legacy stuff about being able to compile without cal3d, haven't been able to since 1.1.2, so safe to delete that bit.

Above uses Makefile.bsd, not bsdg, as I have no knowledge of gmake.

 

Patch on normals.c, if you use the TERRAIN feature:

Index: normals.c

===================================================================

RCS file: /cvsroot/elc/elc/normals.c,v

retrieving revision 1.9

diff -u -r1.9 normals.c

--- normals.c 19 Oct 2005 22:22:53 -0000 1.9

+++ normals.c 6 Dec 2006 23:59:28 -0000

@@ -6,7 +6,10 @@

*/

#include <stdlib.h>

#include <string.h>

+/* BSD malloc is in stdlib.h and now throws a compile error */

+#ifndef BSD

#include <malloc.h>

+#endif

#include <stdio.h>

#ifdef MAP_EDITOR2

#include "../map_editor2/global.h"

Edited by RallosZek

Share this post


Link to post
Share on other sites
Guest killdos

hello all

i installed el-1.3.3 from ports on FreeBSD 6.2-STABLE and now i have an invisible characters. i see only heads and things which it holds in it's hands. how to fix it?

Edited by killdos

Share this post


Link to post
Share on other sites

Since Makefile.bsd is unmaintained, here's a BSDmakefile you can put in elc dir and will be recognized by FreeBSD's pmake:

VERSION=150
PROG=el.x86.bsd.bin.${VERSION}
NO_MAN=yes
EXTRA_INCLUDES?=
EXTRA_LIBS?=
CPPFLAGS=-DBSD -DELC ${EXTRA_INCLUDES}
CFLAGS+=-ffast-math
CXXFLAGS+=-ffast-math

# Core sources
SRCS=2d_objects.c 3d_objects.c \
	actor_scripts.c actors.c alphamap.c asc.c astrology.c \
	bbox_tree.c books.c buddy.c bags.c \
	cache.c cal.c chat.c cluster.c colors.c console.c consolewin.c \
	counters.c cursors.c dialogues.c draw_scene.c   \
	elconfig.c elwindows.c encyclopedia.c errors.c events.c \
	filter.c font.c framebuffer.c frustum.c \
	gamewin.c gl_init.c hud.c help.c highlight.c	\
	ignore.c init.c interface.c items.c	 \
	io/e3d_io.c io/elc_io.c io/map_io.c	 \
	keys.c knowledge.c langselwin.c lights.c list.c load_gl_extensions.c \
	loginwin.c loading_win.c		\
	main.c manufacture.c map.c mapwin.c	 \
	md5.c mines.c misc.c multiplayer.c	  \
	new_actors.c new_character.c	\
	openingwin.c	\
	particles.c paste.c pathfinder.c pm_log.c	   \
	questlog.c queue.c reflection.c rules.c \
	skills.c serverpopup.c servers.c session.c shadows.c sound.c	\
	spells.c stats.c storage.c	  \
	tabs.c text.c textures.c tile_map.c timers.c translate.c trade.c		\
	update.c url.c weather.c widgets.c \
	cal3d_wrapper.cpp

# Feature related sources
ENCYCLOPEDIA_SRCS = books/fontdef.c books/parser.c books/symbol.c books/typesetter.c sort.c symbol_table.c
MEMORY_DEBUG_SRCS = elmemory.c
NOTEPAD_SRCS = notepad.c
POPUP_SRCS = popup.c
SFX_SRCS = special_effects.c
MINIMAP_SRCS = minimap.c
SKY_FPV_CURSOR_SRCS = sky.c
NEW_FILE_IO_SRCS = io/elpathwrapper.c io/xmlcallbacks.c
NEW_FILE_IO_SRCS += io/elfilewrapper.cpp io/elfile.cpp io/zipfilesystem.cpp
USE_SHADER_SRCS = shader/noise.c shader/shader.c
PAWN_SRCS = pawn/amx.c pawn/amxaux.c pawn/amxcons.c pawn/amxel.c \
	pawn/amxfloat.c pawn/amxstring.c pawn/elpawn.c
USE_SEND_VIDEO_INFO_SRCS = sendvideoinfo.cpp
CXX_MISC_SRCS = exceptions/extendedexception.cpp xml/xmlhelper.cpp
EYE_CANDY_SRCS=eye_candy_wrapper.cpp \
	eye_candy/eye_candy.cpp eye_candy/math_cache.cpp eye_candy/effect_lamp.cpp \
	eye_candy/effect_candle.cpp \
	eye_candy/effect_campfire.cpp eye_candy/effect_fountain.cpp \
	eye_candy/effect_teleporter.cpp eye_candy/effect_firefly.cpp \
	eye_candy/effect_sword.cpp eye_candy/effect_summon.cpp \
	eye_candy/effect_selfmagic.cpp eye_candy/effect_targetmagic.cpp \
	eye_candy/effect_ongoing.cpp eye_candy/effect_impact.cpp \
	eye_candy/effect_smoke.cpp eye_candy/effect_bag.cpp eye_candy/effect_cloud.cpp \
	eye_candy/effect_harvesting.cpp eye_candy/effect_wind.cpp \
	eye_candy/effect_breath.cpp eye_candy/effect_mines.cpp \
	eye_candy/orbital_mover.cpp eye_candy/kepler_orbit.cpp

# SDL. Some old ports use sdl$version-config, set accordingly
SDL_CONFIG?=/usr/local/bin/sdl-config
SDL_CFLAGS!=${SDL_CONFIG} --cflags
SDL_LIBS!=${SDL_CONFIG} --libs

# XML 2.
XML2_CONFIG?=/usr/local/bin/xml2-config
XML2_CFLAGS!=${XML2_CONFIG} --cflags
XML2_LIBS!=${XML2_CONFIG} --libs

# Preprocessor basics
CPPFLAGS+=-I/usr/local/include ${SDL_CFLAGS} ${XML2_CFLAGS}

# Linking basics
LDFLAGS+=-L/usr/local/lib
LDADD=${SDL_LIBS} ${XML2_LIBS} -lSDL_net -lSDL_image -lopenal -lalut -lGL
LDADD+=-lGLU -lcal3d -lm ${EXTRA_LIBS}

# Feature related libs
ZLIB_LIBS = -lz
NEW_FILE_IO_LIBS = -lz
EYE_CANDY_LIBS = -lpng
PNG_SCREENSHOT_LIBS = -lpng
OGG_VORBIS_LIBS = -lvorbis -lvorbisfile

# Include features and add them to sources, defines and libs
.include <BSDmakefile.inc>
.for _FEATURE in ${FEATURES}
CPPFLAGS+=-D${_FEATURE}
.if defined(${_FEATURE}_SRCS)
SRCS+=${${_FEATURE}_SRCS}
.endif
.if defined(${_FEATURE}_LIBS)
LDADD+=${${_FEATURE}_LIBS}
.endif
.endfor

.c.o:
	${CC} ${CPPFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}

.cpp.o:
	${CXX} ${CPPFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}

pawn_scripts/features.inc: BSDmakefile.inc
	echo "#if defined _features_included" > ${.TARGET}; \
	echo -e "\t#endinput" >> ${.TARGET}; \
	echo "#endif" >> ${.TARGET}; \
	echo "#define _features_included" >> ${.TARGET}; \
	for feature in ${FEATURES}; do \
			echo "#define $${feature}" >> ${.TARGET}; \
	done

.include <bsd.prog.mk>

 

This uses BSDmakefile.inc, which is basically make.defaults with the sanity checks deleted as these are in GNU make specific syntax. Tip: move those checks to Makefile.linux :)

Anyways, have fun with the new client all.

Share this post


Link to post
Share on other sites
The FreeBSD port of EL has recently been broken by the Mesa upgrade to 7.6.1 (set WITHOUT_NOUVEAU in /etc/make.conf). Can anyone else confirm this or is there an easy fix? :/

I don't know if its related but Llywar said building el on Gentoo was broken by a mesa change too. You could ask them what they did to fix it: see this thread.

Edited by bluap

Share this post


Link to post
Share on other sites

I’ve just tried compiling from CVS: Apparently, the gl_ext.h (old load_gl_extensions.h) stuff is fixed as it now checks for the GL version, but now I’m getting other kinds of errors:

 

EDIT: Ok, I’ve modified the Makefile to get rid of most errors, but these remain (and I have no idea why or how to fix that):

map.o(.text+0x9f6): In function `init_server_markers':
: undefined reference to `cmp_fn_int'
map.o(.text+0x9fb): In function `init_server_markers':
: undefined reference to `hash_fn_int'
books/fontdef.o(.text+0x7f8): In function `fd_load':
: undefined reference to `LOG_ERROR'
books/fontdef.o(.text+0x809): In function `fd_load':
: undefined reference to `LOG_ERROR'
books/fontdef.o(.text+0x81a): In function `fd_load':
: undefined reference to `LOG_ERROR'
books/fontdef.o(.text+0x835): In function `fd_load':
: undefined reference to `LOG_ERROR'
books/fontdef.o(.text+0x850): In function `fd_load':
: undefined reference to `LOG_ERROR'
books/fontdef.o(.text+0x86b): more undefined references to `LOG_ERROR' follow

 

EDIT2: Got the CVS client to compile. I had to:

#include "../errors.h" in books/fontdef.c

remove __inline__ from definition/declaration of [cmp|hash]_fn_[str|int] functions in hash.h as well as hash.c (why are these inline functions although they are used by map.c?)

Edited by Korythaiolos

Share this post


Link to post
Share on other sites

...and here is the Makefile I used (not very nice yet, I’ve modified the above file to work with newer CVS clients; you also have to set some options in BSDmakefile.inc obviously). I’ll make it work with make.defaults though so that it can be committed to CVS as Makefile.bsd hopefully.

 

VERSION=180
PROG=el.x86.bsd.bin.${VERSION}
NO_MAN=yes
EXTRA_INCLUDES?=
EXTRA_LIBS?=
CPPFLAGS=-DBSD -DELC ${EXTRA_INCLUDES}
CFLAGS+=-ffast-math
CXXFLAGS+=-ffast-math
# Core sources
SRCS=2d_objects.c 3d_objects.c \
actor_scripts.c actors.c alphamap.c asc.c astrology.c \
bbox_tree.c books.c buddy.c buffs.c bags.c \
cache.c cal.c calc.c chat.c cluster.c colors.c console.c consolewin.c \
counters.c cursors.c dds.c ddsimage.c dialogues.c draw_scene.c   \
eye_candy_debugwin.c elconfig.c elwindows.c encyclopedia.c errors.c events.c \
filter.c font.c framebuffer.c frustum.c \
gamewin.c gl_init.c hud.c help.c highlight.c	\
ignore.c init.c interface.c items.c	 \
io/e3d_io.c io/elc_io.c io/map_io.c	 \
io/half.c io/normal.c \
keys.c knowledge.c langselwin.c lights.c list.c load_gl_extensions.c \
loginwin.c loading_win.c		\
main.c manufacture.c map.c mapwin.c	 \
md5.c mines.c misc.c missiles.c multiplayer.c	  \
new_actors.c new_character.c  \
openingwin.c	\
particles.c paste.c pathfinder.c pm_log.c	   \
questlog.c queue.c reflection.c rules.c \
skeletons.c skills.c serverpopup.c servers.c session.c shadows.c sound.c  \
spells.c stats.c storage.c  \
tabs.c text.c textures.c tile_map.c timers.c translate.c trade.c		\
update.c url.c weather.c widgets.c makeargv.c hash.c \
cal3d_wrapper.cpp actor_init.cpp optimizer.cpp sendvideoinfo.cpp \

# Feature related sources
ENCYCLOPEDIA_SRCS = books/fontdef.c books/parser.c books/symbols.c books/typesetter.c sort.c symbol_table.c
MEMORY_DEBUG_SRCS = elmemory.c
NOTEPAD_SRCS = notepad.c
POPUP_SRCS = popup.c
SFX_SRCS = special_effects.c
MINIMAP_SRCS = minimap.c
SKY_FPV_CURSOR_SRCS = sky.c
NEW_FILE_IO_SRCS = io/elpathwrapper.c io/xmlcallbacks.c
NEW_FILE_IO_SRCS += io/elfilewrapper.cpp io/elfile.cpp io/zipfilesystem.cpp
USE_SHADER_SRCS = shader/noise.c shader/shader.c
PAWN_SRCS = pawn/amx.c pawn/amxaux.c pawn/amxcons.c pawn/amxel.c \
pawn/amxfloat.c pawn/amxstring.c pawn/elpawn.c
USE_SEND_VIDEO_INFO_SRCS = sendvideoinfo.cpp
CXX_MISC_SRCS = exceptions/extendedexception.cpp xml/xmlhelper.cpp
NEW_SELECTION_SRCS = select.cpp
CONTEXT_MENUS_SRCS = context_menu.cpp
TEXT_ALIASES_SRCS = text_aliases.c
ITEM_LISTS_SRCS = item_lists.cpp
EMOTES_SRCS = emotes.c
USER_MENUS_SRCS = user_menus.cpp
EYE_CANDY_SRCS=eye_candy_wrapper.cpp \
eye_candy/eye_candy.cpp eye_candy/math_cache.cpp eye_candy/effect_lamp.cpp \
eye_candy/effect_candle.cpp \
eye_candy/effect_campfire.cpp eye_candy/effect_fountain.cpp \
eye_candy/effect_teleporter.cpp eye_candy/effect_firefly.cpp \
eye_candy/effect_sword.cpp eye_candy/effect_summon.cpp \
eye_candy/effect_selfmagic.cpp eye_candy/effect_targetmagic.cpp \
eye_candy/effect_ongoing.cpp eye_candy/effect_impact.cpp \
eye_candy/effect_smoke.cpp eye_candy/effect_bag.cpp eye_candy/effect_cloud.cpp \
eye_candy/effect_harvesting.cpp eye_candy/effect_wind.cpp \
eye_candy/effect_breath.cpp eye_candy/effect_glow.cpp eye_candy/effect_mines.cpp \
eye_candy/effect_missile.cpp eye_candy/orbital_mover.cpp eye_candy/kepler_orbit.cpp \
eye_candy/effect_staff.cpp

# SDL. Some old ports use sdl$version-config, set accordingly
SDL_CONFIG?=/usr/local/bin/sdl-config
SDL_CFLAGS!=${SDL_CONFIG} --cflags
SDL_LIBS!=${SDL_CONFIG} --libs

# XML 2.
XML2_CONFIG?=/usr/local/bin/xml2-config
XML2_CFLAGS!=${XML2_CONFIG} --cflags
XML2_LIBS!=${XML2_CONFIG} --libs

# Preprocessor basics
CPPFLAGS+=-I/usr/local/include -I. -Ibooks -Ieye_candy -Iio -Ipawn ${SDL_CFLAGS} ${XML2_CFLAGS}

# Linking basics
LDFLAGS+=-L/usr/local/lib
LDADD=${SDL_LIBS} ${XML2_LIBS} -lSDL_net -lSDL_image -lopenal -lalut -lGL
LDADD+=-lGLU -lcal3d -lm ${EXTRA_LIBS}

# Feature related libs
ZLIB_LIBS = -lz
NEW_FILE_IO_LIBS = -lz
EYE_CANDY_LIBS = -lpng
PNG_SCREENSHOT_LIBS = -lpng
OGG_VORBIS_LIBS = -lvorbis -lvorbisfile

# Include features and add them to sources, defines and libs
.include <BSDmakefile.inc>
.for _FEATURE in ${FEATURES}
CPPFLAGS+=-D${_FEATURE}
.if defined(${_FEATURE}_SRCS)
SRCS+=${${_FEATURE}_SRCS}
.endif
.if defined(${_FEATURE}_LIBS)
LDADD+=${${_FEATURE}_LIBS}
.endif
.endfor

.c.o:
${CC} ${CPPFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}

.cpp.o:
${CXX} ${CPPFLAGS} ${CXXFLAGS} -c ${.IMPSRC} -o ${.TARGET}

pawn_scripts/features.inc: BSDmakefile.inc
echo "#if defined _features_included" > ${.TARGET}; \
echo -e "\t#endinput" >> ${.TARGET}; \
echo "#endif" >> ${.TARGET}; \
echo "#define _features_included" >> ${.TARGET}; \
for feature in ${FEATURES}; do \
	echo "#define $${feature}" >> ${.TARGET}; \
done

.include <bsd.prog.mk>

 

...and I just noticed that tabs get converted to spaces by the forum software. BSD’s make doesn’t like spaces; use tabs instead.

Edited by Korythaiolos

Share this post


Link to post
Share on other sites
Guest Kushtica

Im a new user of freebsd, so forgive me if i seem ignorant.

I have downloaded el and it will run all the way to open login screen, once i enter my login info it says preparing opening window, never moves past this screen, please help :)

Share this post


Link to post
Share on other sites

I'm not a BSD user but I can try to help. Have you checked the EL log file for errors or to see where the client has got stuck?

cat $HOME/.elc/log/main_*.log

Also, do you have 3D accelerated graphic drivers installed and working?

Share this post


Link to post
Share on other sites
Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoticons maximum 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.

Loading...

×