by roundabout, Tuesday, 23 January 2024, 20:45:08 (1706042708), pushed by roundabout, Saturday, 30 March 2024, 13:10:53 (1711804253)
Author identity: vlad <vlad.muntoiu@gmail.com>
8e1526c51b29ac1cb7a5da647e537e9f657f0380
app.py
@@ -20,17 +20,17 @@ from PIL import Image
from flask_httpauth import HTTPBasicAuth
from celery import Celery, Task
import config
import celeryIntegration
import celery_integration
app = flask.Flask(__name__)
app.config.from_mapping(
CELERY=dict(
broker_url=config.REDIS_URI,
result_backend=config.REDIS_URI,
task_ignore_result=True,
),
CELERY=dict(
broker_url=config.REDIS_URI,
result_backend=config.REDIS_URI,
task_ignore_result=True,
),
)
worker = celeryIntegration.initCeleryApp(app)
worker = celery_integration.init_celery_app(app)
auth = HTTPBasicAuth()
@@ -42,10 +42,10 @@ bcrypt = Bcrypt(app)
migrate = Migrate(app, db)
from models import *
import celeryTasks
import celery_tasks
def gitCommand(repo, data, *args):
def git_command(repo, data, *args):
if not os.path.isdir(repo):
raise FileNotFoundError("Repo not found")
env = os.environ.copy()
@@ -63,26 +63,26 @@ def gitCommand(repo, data, *args):
return out
def onlyChars(string, chars):
def only_chars(string, chars):
for i in string:
if i not in chars:
return False
return True
def getPermissionLevel(loggedIn, username, repository):
user = User.query.filter_by(username=loggedIn).first()
def get_permission_level(logged_in, username, repository):
user = User.query.filter_by(username=logged_in).first()
repo = Repo.query.filter_by(route=f"/{username}/{repository}").first()
if user and repo:
permission = RepoAccess.query.filter_by(user=user, repo=repo).first()
if permission:
return permission.accessLevel
return permission.access_level
return None
def getVisibility(username, repository):
def get_visibility(username, repository):
repo = Repo.query.filter_by(route=f"/{username}/{repository}").first()
if repo:
@@ -91,29 +91,30 @@ def getVisibility(username, repository):
return None
def getFavourite(loggedIn, username, repository):
print(loggedIn, username, repository)
relationship = RepoFavourite.query.filter_by(userUsername=loggedIn, repoRoute=f"/{username}/{repository}").first()
def get_favourite(logged_in, username, repository):
print(logged_in, username, repository)
relationship = RepoFavourite.query.filter_by(user_username=logged_in,
repo_route=f"/{username}/{repository}").first()
return relationship
import gitHTTP
import jinjaUtils
import git_http
import jinja_utils
def humanSize(value, decimals=2, scale=1024,
units=("B", "kiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", "RiB", "QiB")):
def human_size(value, decimals=2, scale=1024,
units=("B", "kiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", "RiB", "QiB")):
for unit in units:
if value < scale:
break
value /= scale
if int(value) == value:
# do not return decimals, if the value is already round
# do not return decimals if the value is already round
return int(value), unit
return round(value * 10 ** decimals) / 10 ** decimals, unit
def guessMIME(path):
def guess_mime(path):
if os.path.isdir(path):
mimetype = "inode/directory"
elif magic.from_file(path, mime=True):
@@ -123,7 +124,7 @@ def guessMIME(path):
return mimetype
def convertToHTML(path):
def convert_to_html(path):
with open(path, "r") as f:
contents = f.read()
return contents
@@ -136,13 +137,14 @@ repositories = flask.Blueprint("repository", __name__, template_folder="template
def default():
username = flask.session.get("username")
userObject = User.query.filter_by(username=username).first()
user_object = User.query.filter_by(username=username).first()
return {
"loggedInUser": username,
"userObject": userObject,
"logged_in_user": username,
"user_object": user_object,
"Notification": Notification,
"unread": UserNotification.query.filter_by(userUsername=username).filter(UserNotification.attentionLevel > 0).count()
"unread": UserNotification.query.filter_by(user_username=username).filter(
UserNotification.attention_level > 0).count()
}
@@ -167,12 +169,12 @@ def settings():
else:
user = User.query.filter_by(username=flask.session.get("username")).first()
user.displayName = flask.request.form["displayname"]
user.display_name = flask.request.form["displayname"]
user.URL = flask.request.form["url"]
user.company = flask.request.form["company"]
user.companyURL = flask.request.form["companyurl"]
user.company_URL = flask.request.form["companyurl"]
user.location = flask.request.form["location"]
user.showMail = True if flask.request.form.get("showmail") else False
user.show_mail = True if flask.request.form.get("showmail") else False
user.bio = flask.request.form.get("bio")
db.session.commit()
@@ -186,7 +188,7 @@ def favourites():
if not flask.session.get("username"):
flask.abort(401)
if flask.request.method == "GET":
relationships = RepoFavourite.query.filter_by(userUsername=flask.session.get("username"))
relationships = RepoFavourite.query.filter_by(user_username=flask.session.get("username"))
return flask.render_template("favourites.html", favourites=relationships)
@@ -196,7 +198,8 @@ def notifications():
if not flask.session.get("username"):
flask.abort(401)
if flask.request.method == "GET":
return flask.render_template("notifications.html", notifications=UserNotification.query.filter_by(userUsername=flask.session.get("username")))
return flask.render_template("notifications.html", notifications=UserNotification.query.filter_by(
user_username=flask.session.get("username")))
@app.route("/accounts/", methods=["GET", "POST"])
@@ -210,11 +213,11 @@ def login():
user = User.query.filter_by(username=username).first()
if user and bcrypt.check_password_hash(user.passwordHashed, password):
if user and bcrypt.check_password_hash(user.password_hashed, password):
flask.session["username"] = user.username
flask.flash(
Markup(f"<iconify-icon icon='mdi:account'></iconify-icon>Successfully logged in as {username}"),
category="success")
Markup(f"<iconify-icon icon='mdi:account'></iconify-icon>Successfully logged in as {username}"),
category="success")
return flask.redirect("/", code=303)
elif not user:
flask.flash(Markup("<iconify-icon icon='mdi:account-question'></iconify-icon>User not found"),
@@ -232,23 +235,25 @@ def login():
email2 = flask.request.form.get("email2") # repeat email is a honeypot
name = flask.request.form.get("name")
if not onlyChars(username, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"):
if not only_chars(username, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"):
flask.flash(Markup(
"<iconify-icon icon='mdi:account-error'></iconify-icon>Usernames may only contain Latin alphabet, numbers, '-' and '_'"),
category="error")
"<iconify-icon icon='mdi:account-error'></iconify-icon>Usernames may only contain Latin alphabet, numbers, '-' and '_'"),
category="error")
return flask.render_template("login.html")
if username in config.RESERVED_NAMES:
flask.flash(
Markup(f"<iconify-icon icon='mdi:account-error'></iconify-icon>Sorry, {username} is a system path"),
category="error")
Markup(
f"<iconify-icon icon='mdi:account-error'></iconify-icon>Sorry, {username} is a system path"),
category="error")
return flask.render_template("login.html")
userCheck = User.query.filter_by(username=username).first()
if userCheck:
user_check = User.query.filter_by(username=username).first()
if user_check:
flask.flash(
Markup(f"<iconify-icon icon='mdi:account-error'></iconify-icon>The username {username} is taken"),
category="error")
Markup(
f"<iconify-icon icon='mdi:account-error'></iconify-icon>The username {username} is taken"),
category="error")
return flask.render_template("login.html")
if password2 != password:
@@ -261,13 +266,13 @@ def login():
db.session.commit()
flask.session["username"] = user.username
flask.flash(Markup(
f"<iconify-icon icon='mdi:account'></iconify-icon>Successfully created and logged in as {username}"),
category="success")
f"<iconify-icon icon='mdi:account'></iconify-icon>Successfully created and logged in as {username}"),
category="success")
return flask.redirect("/", code=303)
@app.route("/newrepo/", methods=["GET", "POST"])
def newRepo():
def new_repo():
if not flask.session.get("username"):
flask.abort(401)
if flask.request.method == "GET":
@@ -276,7 +281,7 @@ def newRepo():
name = flask.request.form["name"]
visibility = int(flask.request.form["visibility"])
if not onlyChars(name, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"):
if not only_chars(name, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_"):
flask.flash(Markup(
"<iconify-icon icon='mdi:error'></iconify-icon>Repository names may only contain Latin alphabet, numbers, '-' and '_'"),
category="error")
@@ -305,28 +310,30 @@ def logout():
@app.route("/<username>/", methods=["GET", "POST"])
def userProfile(username):
oldRelationship = UserFollow.query.filter_by(followerUsername=flask.session.get("username"), followedUsername=username).first()
def user_profile(username):
old_relationship = UserFollow.query.filter_by(followerUsername=flask.session.get("username"),
followedUsername=username).first()
if flask.request.method == "GET":
user = User.query.filter_by(username=username).first()
match flask.request.args.get("action"):
case "repositories":
repos = Repo.query.filter_by(ownerName=username, visibility=2)
return flask.render_template("user-profile-repositories.html", user=user, repos=repos, relationship=oldRelationship)
return flask.render_template("user-profile-repositories.html", user=user, repos=repos,
relationship=old_relationship)
case "followers":
return flask.render_template("user-profile-followers.html", user=user, relationship=oldRelationship)
return flask.render_template("user-profile-followers.html", user=user, relationship=old_relationship)
case "follows":
return flask.render_template("user-profile-follows.html", user=user, relationship=oldRelationship)
return flask.render_template("user-profile-follows.html", user=user, relationship=old_relationship)
case _:
return flask.render_template("user-profile-overview.html", user=user, relationship=oldRelationship)
return flask.render_template("user-profile-overview.html", user=user, relationship=old_relationship)
elif flask.request.method == "POST":
match flask.request.args.get("action"):
case "follow":
if username == flask.session.get("username"):
flask.abort(403)
if oldRelationship:
db.session.delete(oldRelationship)
if old_relationship:
db.session.delete(old_relationship)
else:
relationship = UserFollow(
flask.session.get("username"),
@@ -341,7 +348,7 @@ def userProfile(username):
db.session.add(notification)
db.session.commit()
result = celeryTasks.sendNotification.delay(notification.id, [username], 1)
result = celery_tasks.send_notification.delay(notification.id, [username], 1)
flask.flash(f"Sending notification in task {result.id}", "success")
db.session.commit()
@@ -349,12 +356,12 @@ def userProfile(username):
@app.route("/<username>/<repository>/")
def repositoryIndex(username, repository):
def repository_index(username, repository):
return flask.redirect("./tree", code=302)
@app.route("/info/<username>/avatar")
def userAvatar(username):
def user_avatar(username):
serverUserdataLocation = os.path.join(config.USERDATA_PATH, username)
if not os.path.exists(serverUserdataLocation):
@@ -364,9 +371,9 @@ def userAvatar(username):
@app.route("/<username>/<repository>/raw/<branch>/<path:subpath>")
def repositoryRaw(username, repository, branch, subpath):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
def repository_raw(username, repository, branch, subpath):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
@@ -409,29 +416,29 @@ def repositoryRaw(username, repository, branch, subpath):
@repositories.route("/<username>/<repository>/tree/", defaults={"branch": None, "subpath": ""})
@repositories.route("/<username>/<repository>/tree/<branch>/", defaults={"subpath": ""})
@repositories.route("/<username>/<repository>/tree/<branch>/<path:subpath>")
def repositoryTree(username, repository, branch, subpath):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
def repository_tree(username, repository, branch, subpath):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
if not repoData.defaultBranch:
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
if not repo_data.defaultBranch:
if repo.heads:
repoData.defaultBranch = repo.heads[0].name
repo_data.defaultBranch = repo.heads[0].name
else:
return flask.render_template("empty.html",
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}"), 200
if not branch:
branch = repoData.defaultBranch
branch = repo_data.defaultBranch
return flask.redirect(f"./{branch}", code=302)
if branch.startswith("tag:"):
@@ -450,46 +457,46 @@ def repositoryTree(username, repository, branch, subpath):
branches = repo.heads
allRefs = []
all_refs = []
for ref in repo.heads:
allRefs.append((ref, "head"))
all_refs.append((ref, "head"))
for ref in repo.tags:
allRefs.append((ref, "tag"))
all_refs.append((ref, "tag"))
if os.path.isdir(os.path.join(serverRepoLocation, subpath)):
if os.path.isdir(os.path.join(server_repo_location, subpath)):
files = []
blobs = []
for entry in os.listdir(os.path.join(serverRepoLocation, subpath)):
for entry in os.listdir(os.path.join(server_repo_location, subpath)):
if not os.path.basename(entry) == ".git":
files.append(os.path.join(subpath, entry))
infos = []
for file in files:
path = os.path.join(serverRepoLocation, file)
mimetype = guessMIME(path)
path = os.path.join(server_repo_location, file)
mimetype = guess_mime(path)
text = gitCommand(serverRepoLocation, None, "log", "--format='%H\n'", file).decode()
text = git_command(server_repo_location, None, "log", "--format='%H\n'", file).decode()
sha = text.split("\n")[0]
identifier = f"/{username}/{repository}/{sha}"
lastCommit = Commit.query.filter_by(identifier=identifier).first()
last_commit = Commit.query.filter_by(identifier=identifier).first()
info = {
"name": os.path.basename(file),
"serverPath": path,
"relativePath": file,
"link": os.path.join(f"/{username}/{repository}/tree/{branch}/", file),
"size": humanSize(os.path.getsize(path)),
"size": human_size(os.path.getsize(path)),
"mimetype": f"{mimetype}{f' ({mimetypes.guess_type(path)[1]})' if mimetypes.guess_type(path)[1] else ''}",
"commit": lastCommit,
"commit": last_commit,
"shaSize": 7,
}
specialIcon = config.matchIcon(os.path.basename(file))
if specialIcon:
info["icon"] = specialIcon
special_icon = config.matchIcon(os.path.basename(file))
if special_icon:
info["icon"] = special_icon
elif os.path.isdir(path):
info["icon"] = config.folderIcon
elif mimetypes.guess_type(path)[0] in config.fileIcons:
@@ -508,24 +515,24 @@ def repositoryTree(username, repository, branch, subpath):
repository=repository,
files=infos,
subpath=os.path.join("/", subpath),
branches=allRefs,
branches=all_refs,
current=branch,
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
isFavourite=getFavourite(flask.session.get("username"), username, repository)
is_favourite=get_favourite(flask.session.get("username"), username, repository)
)
else:
path = os.path.join(serverRepoLocation, subpath)
path = os.path.join(server_repo_location, subpath)
if not os.path.exists(path):
return flask.render_template("not-found.html"), 404
mimetype = guessMIME(path)
mimetype = guess_mime(path)
mode = mimetype.split("/", 1)[0]
size = humanSize(os.path.getsize(path))
size = human_size(os.path.getsize(path))
specialIcon = config.matchIcon(os.path.basename(path))
if specialIcon:
icon = specialIcon
special_icon = config.matchIcon(os.path.basename(path))
if special_icon:
icon = special_icon
elif os.path.isdir(path):
icon = config.folderIcon
elif mimetypes.guess_type(path)[0] in config.fileIcons:
@@ -535,14 +542,14 @@ def repositoryTree(username, repository, branch, subpath):
contents = None
if mode == "text":
contents = convertToHTML(path)
contents = convert_to_html(path)
return flask.render_template(
"repo-file.html",
username=username,
repository=repository,
file=os.path.join(f"/{username}/{repository}/raw/{branch}/", subpath),
branches=allRefs,
branches=all_refs,
current=branch,
mode=mode,
mimetype=mimetype,
@@ -553,217 +560,288 @@ def repositoryTree(username, repository, branch, subpath):
basename=os.path.basename(path),
contents=contents,
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
isFavourite=getFavourite(flask.session.get("username"), username, repository)
is_favourite=get_favourite(flask.session.get("username"), username, repository)
)
@repositories.route("/<username>/<repository>/forum/")
def repositoryForum(username, repository):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
def repository_forum(username, repository):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
relationships = RepoAccess.query.filter_by(repo=repoData)
userRelationship = RepoAccess.query.filter_by(repo=repoData, user=user).first()
relationships = RepoAccess.query.filter_by(repo=repo_data)
user_relationship = RepoAccess.query.filter_by(repo=repo_data, user=user).first()
return flask.render_template(
"repo-forum.html",
username=username,
repository=repository,
repoData=repoData,
repo_data=repo_data,
relationships=relationships,
repo=repo,
userRelationship=userRelationship,
user_relationship=user_relationship,
Post=Post,
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
isFavourite=getFavourite(flask.session.get("username"), username, repository)
is_favourite=get_favourite(flask.session.get("username"), username, repository),
default_branch=repo_data.defaultBranch
)
@repositories.route("/<username>/<repository>/forum/new", methods=["POST"])
def repositoryForumAdd(username, repository):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
@repositories.route("/<username>/<repository>/forum/topic/<int:id>")
def repository_forum_topic(username, repository, id):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
relationships = RepoAccess.query.filter_by(repo=repoData)
userRelationship = RepoAccess.query.filter_by(repo=repoData, user=user).first()
relationships = RepoAccess.query.filter_by(repo=repo_data)
user_relationship = RepoAccess.query.filter_by(repo=repo_data, user=user).first()
post = Post(user, repoData, None, flask.request.form["subject"], flask.request.form["message"])
post = Post.query.filter_by(id=id).first()
db.session.add(post)
db.session.commit()
return flask.render_template(
"repo-topic.html",
username=username,
repository=repository,
repo_data=repo_data,
relationships=relationships,
user_relationship=user_relationship,
post=post,
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
is_favourite=get_favourite(flask.session.get("username"), username, repository),
default_branch=repo_data.defaultBranch
)
@repositories.route("/<username>/<repository>/forum/create-topic", methods=["POST", "GET"])
def repository_forum_create_topic(username, repository):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
return flask.redirect(flask.url_for(".repositoryForumThread", username=username, repository=repository, postID=post.number), code=303)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
relationships = RepoAccess.query.filter_by(repo=repo_data)
user_relationship = RepoAccess.query.filter_by(repo=repo_data, user=user).first()
if flask.request.method == "POST":
# Check if the user has permission to create a topic
if not user_relationship or not user_relationship.permissionCreateTopic:
flask.abort(403)
# Get form data
title = flask.request.form.get("title")
content = flask.request.form.get("content")
# Validate form data
if not title or not content:
flask.flash("Title and content are required", "error")
return flask.redirect(
flask.url_for("repository_forum_create_topic", username=username, repository=repository))
# Create a new topic
new_topic = Post(
title=title,
content=content,
author=user,
repo=repo_data
)
db.session.add(new_topic)
db.session.commit()
flask.flash("Topic created successfully!", "success")
return flask.redirect(
flask.url_for("repository_forum_topic", username=username, repository=repository, id=new_topic.id))
return flask.render_template(
"repo-create-topic.html",
username=username,
repository=repository,
repo_data=repo_data,
relationships=relationships,
user_relationship=user_relationship,
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
is_favourite=get_favourite(flask.session.get("username"), username, repository),
default_branch=repo_data.defaultBranch
)
@repositories.route("/<username>/<repository>/forum/<int:postID>")
def repositoryForumThread(username, repository, postID):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
@repositories.route("/<username>/<repository>/forum/<int:post_id>")
def repository_forum_thread(username, repository, post_id):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
relationships = RepoAccess.query.filter_by(repo=repoData)
userRelationship = RepoAccess.query.filter_by(repo=repoData, user=user).first()
relationships = RepoAccess.query.filter_by(repo=repo_data)
user_relationship = RepoAccess.query.filter_by(repo=repo_data, user=user).first()
return flask.render_template(
"repo-forum-thread.html",
username=username,
repository=repository,
repoData=repoData,
repo_data=repo_data,
relationships=relationships,
repo=repo,
userRelationship=userRelationship,
Post=Post,
postID=postID,
maxPostNesting=4,
user_relationship=user_relationship,
post_id=post_id,
max_post_nesting=4,
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
isFavourite=getFavourite(flask.session.get("username"), username, repository)
is_favourite=get_favourite(flask.session.get("username"), username, repository)
)
@repositories.route("/<username>/<repository>/forum/<int:postID>/reply", methods=["POST"])
def repositoryForumReply(username, repository, postID):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
@repositories.route("/<username>/<repository>/forum/<int:post_id>/reply", methods=["POST"])
def repository_forum_reply(username, repository, post_id):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
relationships = RepoAccess.query.filter_by(repo=repoData)
userRelationship = RepoAccess.query.filter_by(repo=repoData, user=user).first()
relationships = RepoAccess.query.filter_by(repo=repo_data)
user_relationship = RepoAccess.query.filter_by(repo=repo_data, user=user).first()
if not user:
flask.abort(401)
parent = Post.query.filter_by(identifier=f"/{username}/{repository}/{postID}").first()
post = Post(user, repoData, parent, flask.request.form["subject"], flask.request.form["message"])
parent = Post.query.filter_by(identifier=f"/{username}/{repository}/{post_id}").first()
post = Post(user, repo_data, parent, flask.request.form["subject"], flask.request.form["message"])
db.session.add(post)
post.updateDate()
post.update_date()
db.session.commit()
return flask.redirect(flask.url_for(".repositoryForumThread", username=username, repository=repository, postID=postID), code=303)
return flask.redirect(
flask.url_for(".repository_forum_thread", username=username, repository=repository, post_id=post_id), code=303)
@app.route("/<username>/<repository>/forum/<int:postID>/voteup", defaults={"score": 1})
@app.route("/<username>/<repository>/forum/<int:postID>/votedown", defaults={"score": -1})
@app.route("/<username>/<repository>/forum/<int:postID>/votes", defaults={"score": 0})
def repositoryForumVote(username, repository, postID, score):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
@repositories.route("/<username>/<repository>/forum/<int:post_id>/voteup", defaults={"score": 1})
@repositories.route("/<username>/<repository>/forum/<int:post_id>/votedown", defaults={"score": -1})
@repositories.route("/<username>/<repository>/forum/<int:post_id>/votes", defaults={"score": 0})
def repository_forum_vote(username, repository, post_id, score):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
relationships = RepoAccess.query.filter_by(repo=repoData)
userRelationship = RepoAccess.query.filter_by(repo=repoData, user=user).first()
relationships = RepoAccess.query.filter_by(repo=repo_data)
user_relationship = RepoAccess.query.filter_by(repo=repo_data, user=user).first()
if not user:
flask.abort(401)
post = Post.query.filter_by(identifier=f"/{username}/{repository}/{postID}").first()
post = Post.query.filter_by(identifier=f"/{username}/{repository}/{post_id}").first()
if score:
oldRelationship = PostVote.query.filter_by(userUsername=user.username, postIdentifier=post.identifier).first()
if oldRelationship:
if score == oldRelationship.voteScore:
db.session.delete(oldRelationship)
post.voteSum -= oldRelationship.voteScore
old_relationship = PostVote.query.filter_by(user_username=user.username,
post_identifier=post.identifier).first()
if old_relationship:
if score == old_relationship.vote_score:
db.session.delete(old_relationship)
post.vote_sum -= old_relationship.vote_score
else:
post.voteSum -= oldRelationship.voteScore
post.voteSum += score
oldRelationship.voteScore = score
post.vote_sum -= old_relationship.vote_score
post.vote_sum += score
old_relationship.vote_score = score
else:
relationship = PostVote(user, post, score)
post.voteSum += score
post.vote_sum += score
db.session.add(relationship)
db.session.commit()
userVote = PostVote.query.filter_by(userUsername=user.username, postIdentifier=post.identifier).first()
response = flask.make_response(str(post.voteSum) + " " + str(userVote.voteScore if userVote else 0))
user_vote = PostVote.query.filter_by(user_username=user.username, post_identifier=post.identifier).first()
response = flask.make_response(str(post.vote_sum) + " " + str(user_vote.vote_score if user_vote else 0))
response.content_type = "text/plain"
return response
@app.route("/<username>/<repository>/favourite")
def repositoryFavourite(username, repository):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
@repositories.route("/<username>/<repository>/favourite")
def repository_favourite(username, repository):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
relationships = RepoAccess.query.filter_by(repo=repoData)
userRelationship = RepoAccess.query.filter_by(repo=repoData, user=user).first()
relationships = RepoAccess.query.filter_by(repo=repo_data)
user_relationship = RepoAccess.query.filter_by(repo=repo_data, user=user).first()
if not user:
flask.abort(401)
oldRelationship = RepoFavourite.query.filter_by(userUsername=user.username, repoRoute=repoData.route).first()
if oldRelationship:
db.session.delete(oldRelationship)
old_relationship = RepoFavourite.query.filter_by(user_username=user.username, repo_route=repo_data.route).first()
if old_relationship:
db.session.delete(old_relationship)
else:
relationship = RepoFavourite(user, repoData)
relationship = RepoFavourite(user, repo_data)
db.session.add(relationship)
db.session.commit()
@@ -772,113 +850,113 @@ def repositoryFavourite(username, repository):
@repositories.route("/<username>/<repository>/users/", methods=["GET", "POST"])
def repositoryUsers(username, repository):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
def repository_users(username, repository):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
user = User.query.filter_by(username=flask.session.get("username")).first()
relationships = RepoAccess.query.filter_by(repo=repoData)
userRelationship = RepoAccess.query.filter_by(repo=repoData, user=user).first()
relationships = RepoAccess.query.filter_by(repo=repo_data)
user_relationship = RepoAccess.query.filter_by(repo=repo_data, user=user).first()
if flask.request.method == "GET":
return flask.render_template(
"repo-users.html",
username=username,
repository=repository,
repoData=repoData,
repo_data=repo_data,
relationships=relationships,
repo=repo,
userRelationship=userRelationship,
user_relationship=user_relationship,
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
isFavourite=getFavourite(flask.session.get("username"), username, repository)
is_favourite=get_favourite(flask.session.get("username"), username, repository)
)
else:
if getPermissionLevel(flask.session.get("username"), username, repository) != 2:
if get_permission_level(flask.session.get("username"), username, repository) != 2:
flask.abort(401)
if flask.request.form.get("new-username"):
# Create new relationship
newUser = User.query.filter_by(username=flask.request.form.get("new-username")).first()
relationship = RepoAccess(newUser, repoData, flask.request.form.get("new-level"))
new_user = User.query.filter_by(username=flask.request.form.get("new-username")).first()
relationship = RepoAccess(new_user, repo_data, flask.request.form.get("new-level"))
db.session.add(relationship)
db.session.commit()
if flask.request.form.get("update-username"):
# Create new relationship
updatedUser = User.query.filter_by(username=flask.request.form.get("update-username")).first()
relationship = RepoAccess.query.filter_by(repo=repoData, user=updatedUser).first()
updated_user = User.query.filter_by(username=flask.request.form.get("update-username")).first()
relationship = RepoAccess.query.filter_by(repo=repo_data, user=updated_user).first()
if flask.request.form.get("update-level") == -1:
relationship.delete()
else:
relationship.accessLevel = flask.request.form.get("update-level")
relationship.access_level = flask.request.form.get("update-level")
db.session.commit()
return flask.redirect(app.url_for(".repositoryUsers", username=username, repository=repository))
return flask.redirect(app.url_for(".repository_users", username=username, repository=repository))
@repositories.route("/<username>/<repository>/branches/")
def repositoryBranches(username, repository):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
def repository_branches(username, repository):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
return flask.render_template(
"repo-branches.html",
username=username,
repository=repository,
repoData=repoData,
repo_data=repo_data,
repo=repo,
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
isFavourite=getFavourite(flask.session.get("username"), username, repository)
is_favourite=get_favourite(flask.session.get("username"), username, repository)
)
@repositories.route("/<username>/<repository>/log/", defaults={"branch": None})
@repositories.route("/<username>/<repository>/log/<branch>/")
def repositoryLog(username, repository, branch):
if not (getVisibility(username, repository) or getPermissionLevel(flask.session.get("username"), username,
repository) is not None):
def repository_log(username, repository, branch):
if not (get_visibility(username, repository) or get_permission_level(flask.session.get("username"), username,
repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository)
app.logger.info(f"Loading {serverRepoLocation}")
app.logger.info(f"Loading {server_repo_location}")
if not os.path.exists(serverRepoLocation):
app.logger.error(f"Cannot load {serverRepoLocation}")
if not os.path.exists(server_repo_location):
app.logger.error(f"Cannot load {server_repo_location}")
return flask.render_template("not-found.html"), 404
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
if not repoData.defaultBranch:
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
if not repo_data.default_branch:
if repo.heads:
repoData.defaultBranch = repo.heads[0].name
repo_data.default_branch = repo.heads[0].name
else:
return flask.render_template("empty.html",
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}"), 200
if not branch:
branch = repoData.defaultBranch
branch = repo_data.default_branch
return flask.redirect(f"./{branch}", code=302)
if branch.startswith("tag:"):
@@ -897,33 +975,34 @@ def repositoryLog(username, repository, branch):
branches = repo.heads
allRefs = []
all_refs = []
for ref in repo.heads:
allRefs.append((ref, "head"))
all_refs.append((ref, "head"))
for ref in repo.tags:
allRefs.append((ref, "tag"))
all_refs.append((ref, "tag"))
commitList = [f"/{username}/{repository}/{sha}" for sha in gitCommand(serverRepoLocation, None, "log", "--format='%H'").decode().split("\n")]
commit_list = [f"/{username}/{repository}/{sha}" for sha in
git_command(server_repo_location, None, "log", "--format='%H'").decode().split("\n")]
commits = Commit.query.filter(Commit.identifier.in_(commitList))
commits = Commit.query.filter(Commit.identifier.in_(commit_list))
return flask.render_template(
"repo-log.html",
username=username,
repository=repository,
branches=allRefs,
branches=all_refs,
current=branch,
repoData=repoData,
repo_data=repo_data,
repo=repo,
commits=commits,
remote=f"http{'s' if config.suggestHTTPS else ''}://{config.BASE_DOMAIN}/git/{username}/{repository}",
isFavourite=getFavourite(flask.session.get("username"), username, repository)
is_favourite=get_favourite(flask.session.get("username"), username, repository)
)
@repositories.route("/<username>/<repository>/settings/")
def repositorySettings(username, repository):
if getPermissionLevel(flask.session.get("username"), username, repository) != 2:
def repository_settings(username, repository):
if get_permission_level(flask.session.get("username"), username, repository) != 2:
flask.abort(401)
return flask.render_template("repo-settings.html", username=username, repository=repository)
@@ -957,5 +1036,4 @@ def e405(error):
if __name__ == "__main__":
app.run(debug=True, port=8080, host="0.0.0.0")
app.register_blueprint(repositories)
celeryIntegration.py
@@ -1,15 +0,0 @@
import flask
from celery import Celery, Task
def initCeleryApp(app: flask.Flask):
class FlaskTask(Task):
def __call__(self, *args: object, **kwargs: object):
with app.app_context():
return self.run(*args, **kwargs)
celeryApp = Celery(app.name, task_cls=FlaskTask)
celeryApp.config_from_object(app.config["CELERY"])
celeryApp.set_default()
app.extensions["celery"] = celeryApp
return celeryApp
celeryTasks.py
@@ -1,15 +0,0 @@
import time
from celery import shared_task
from app import db
from models import *
@shared_task(ignore_result=False)
def sendNotification(notificationID, users, level):
notification = db.session.get(Notification, notificationID)
for user in users:
db.session.add(UserNotification(db.session.get(User, user), notification, level))
db.session.commit()
return 0 # notification sent successfully
celery_integration.py
@@ -0,0 +1,15 @@
import flask
from celery import Celery, Task
def init_celery_app(app: flask.Flask):
class FlaskTask(Task):
def __call__(self, *args: object, **kwargs: object):
with app.app_context():
return self.run(*args, **kwargs)
celery_app = Celery(app.name, task_cls=FlaskTask)
celery_app.config_from_object(app.config["CELERY"])
celery_app.set_default()
app.extensions["celery"] = celery_app
return celery_app
celery_tasks.py
@@ -0,0 +1,15 @@
import time
from celery import shared_task
from app import db
from models import *
@shared_task(ignore_result=False)
def send_notification(notification_id, users, level):
notification = db.session.get(Notification, notification_id)
for user in users:
db.session.add(UserNotification(db.session.get(User, user), notification, level))
db.session.commit()
return 0 # notification sent successfully
config.py
@@ -8,7 +8,7 @@ REDIS_URI: str = "redis://localhost"
REPOS_PATH: str = "./repos"
USERDATA_PATH: str = "./userdata"
DEFAULT_AVATARS_PATH: str = "./defaultAvatars"
DEFAULT_AVATARS_PATH: str = "default_avatars"
BASE_DOMAIN: str = "localhost"
SERVER_IPS: set = {"127.0.0.1", "localhost", "0.0.0.0"}
AUTH_REALM: str = "roundabout"
defaultAvatars/bat.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="bat.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.4785557"
inkscape:cx="41.109015"
inkscape:cy="107.80336"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 1.5874982,16.561181 c 0,0 8.9958338,-2.116664 15.3458338,2.116673 0,0 1.058334,7.937496 5.291667,7.937496 v -3.704168 c 0,0 1.058334,2.116672 3.175001,2.116672 2.116667,0 3.175,-2.116672 3.175,-2.116672 v 3.704168 c 4.233334,0 5.291668,-7.937496 5.291668,-7.937496 6.35,-4.233337 15.345834,-2.116673 15.345834,-2.116673 -4.233334,2.116673 -4.7625,9.525001 -4.7625,9.525001 -8.466668,0 -8.466668,6.879169 -8.466668,6.879169 C 25.4,30.848687 25.4,38.786183 25.4,38.786183 c 0,0 0,-7.937496 -10.583334,-5.820832 0,0 0,-6.879169 -8.4666673,-6.879169 0,0 -0.5291664,-7.408328 -4.7625005,-9.525001 z"
id="path1-5"
style="fill:#eceff1;stroke-width:2.11666" /></g></svg>
defaultAvatars/bee.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="bee.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ffc107;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="M 36.777121,18.944178 C 35.930456,16.404174 34.237117,14.710843 31.697113,13.652505 V 10.4775 h -2.116667 v 2.963341 h -0.846674 c -2.328331,0 -4.233335,0.846665 -5.926673,2.540004 l -0.846666,0.846665 -2.96334,-1.058337 c -0.635041,-0.211681 -1.270003,-0.423361 -2.116668,-0.423361 -1.270002,0 -2.540004,0.423361 -3.598342,1.270002 -1.270002,0.846665 -1.905003,1.905003 -2.328339,2.963333 -0.423361,1.481674 -0.423361,2.751676 0,4.233343 0.634961,1.481666 1.270002,2.540004 2.328339,3.175005 -0.846665,3.175005 -0.21168,5.926673 2.116668,8.255013 1.693338,1.693339 3.598342,2.540004 5.926681,2.540004 1.05833,0 1.693331,0 2.328332,-0.21168 1.270002,1.693339 2.963341,2.751668 5.080008,2.751668 0.634961,0 1.481675,0 2.116676,-0.21168 1.270002,-0.423361 2.116667,-1.270002 2.963333,-2.328332 0.846673,-1.270002 1.270002,-2.32834 1.270002,-3.598342 0,-0.846665 0,-1.481666 -0.211681,-2.116667 l -1.058337,-3.386678 1.270002,-0.846673 c 1.693338,-1.693331 2.540004,-4.02167 2.328339,-6.561675 h 2.751669 v -2.328339 h -3.38667 m -20.531697,4.868344 c -1.270002,-0.634961 -1.693339,-1.481667 -1.270002,-2.751669 0.423361,-1.270002 1.270002,-1.693339 2.540004,-1.270002 l 6.773339,2.540004 c -3.386669,1.693331 -5.926673,2.116668 -8.043341,1.481667 M 29.58043,35.665813 c -1.270002,0.42336 -2.116676,0 -2.751677,-1.270002 -0.635041,-2.116676 -0.21168,-4.65668 1.481675,-8.043349 l 2.540004,6.561674 c 0.42336,1.481675 0,2.32834 -1.270002,2.751677 m 2.540004,-11.218354 -1.270002,-3.38667 v -0.21168 L 30.215391,20.214068 H 30.00371 l -3.386669,-1.270002 c 0.846665,-0.634961 1.693339,-1.05833 2.751668,-1.05833 1.058338,0 2.116676,0.423361 2.963341,1.270002 0.846665,0.846665 1.270002,1.693331 1.270002,2.751668 -0.423361,0.634962 -0.846665,1.693339 -1.481666,2.540005 z"
id="path1-9"
style="stroke-width:2.11667;fill:#ff6f00" /></g></svg>
defaultAvatars/bird.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="bird.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.0855027"
inkscape:cx="153.44022"
inkscape:cy="128.98569"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#9c27b0;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 50.712198,23.289884 -6.455906,-2.391859 c -0.550326,-2.434195 -1.92619,-3.831211 -1.92619,-3.831211 -3.471367,-3.471376 -9.080599,-3.471376 -12.551974,0 l -3.1327,3.132699 L 12.611765,5.2980162 c -2.116688,8.4667598 0,16.9335198 5.185899,23.7492698 L 6.2616977,40.223413 c 0,0 18.8173763,4.233376 29.7818373,-4.339218 5.842066,-4.572051 7.154417,-7.239082 7.979923,-10.054282 l 6.68874,-2.540029 M 39.51491,23.75557 c -0.825513,0.825505 -2.180192,0.825505 -3.005706,0 -0.825505,-0.825514 -0.825505,-2.159025 0,-2.984538 0.825514,-0.825506 2.180193,-0.825506 3.005706,0 0.825506,0.825513 0.825506,2.159024 0,2.984538 z"
id="path1-3"
style="fill:#f3e5f5;stroke-width:2.11669" /></g></svg>
defaultAvatars/bug.svg
@@ -1,84 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="bug.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.7889873"
inkscape:cx="117.97347"
inkscape:cy="97.651422"
inkscape:current-layer="layer1"
showguides="false" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#f44336;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 29.633336,25.4 h -8.466664 v -4.233336 h 8.466664 m 0,12.7 h -8.466664 v -4.233328 h 8.466664 m 12.7,-12.7 h -5.947832 c -0.952496,-1.651 -2.264832,-3.069168 -3.852336,-4.148672 L 35.983336,9.3344956 32.99884,6.3499996 28.405672,10.943168 c -0.973664,-0.2328 -1.947336,-0.35984 -3.005664,-0.35984 -1.058336,0 -2.032,0.12696 -2.984504,0.35984 l -4.614336,-4.5931684 -2.984496,2.984496 3.429,3.4501684 c -1.566336,1.079504 -2.878664,2.497672 -3.831168,4.148672 H 8.4666716 v 4.233328 h 4.4238324 c -0.10584,0.69848 -0.19048,1.397 -0.19048,2.116672 V 25.4 H 8.4666876 v 4.233336 H 12.700024 V 31.75 c 0,0.71968 0.08464,1.418168 0.19048,2.116664 H 8.4666636 V 38.1 H 14.414496 C 16.615832,41.888832 20.701,44.45 25.4,44.45 c 4.699,0 8.78416,-2.561168 10.985496,-6.35 h 5.947832 v -4.233336 h -4.423832 c 0.10584,-0.69848 0.19048,-1.397 0.19048,-2.116664 v -2.116664 h 4.233328 V 25.4 h -4.233328 v -2.116664 c 0,-0.71968 -0.08464,-1.418168 -0.19048,-2.116672 h 4.423832 z"
id="path1-2"
style="stroke-width:2.11666;fill:#ffebee" /></g></svg>
defaultAvatars/butterfly.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="butterfly.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="80.675909"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#4caf50;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 27.516823,44.449976 h -4.233326 v -31.74998 l -4.169829,-4.2968374 2.053159,-2.053159 4.233333,4.2333254 4.233333,-4.2333254 2.116663,2.116663 -4.233333,4.2333334 v 31.74998 M 14.81683,12.699996 c -5.8419964,0 -10.5833214,4.741325 -10.5833214,10.583322 0,3.471333 1.672167,6.540499 4.233325,8.466666 v 0 4.233326 c 0,4.677837 3.7888384,8.466666 8.4666674,8.466666 1.523999,0 2.942166,-0.402159 4.16983,-1.058335 l 0.0632,-0.08464 V 14.816683 C 19.388508,13.48318 17.208349,12.70002 14.81651,12.70002 m -1.058327,13.75832 -3.174998,-3.174999 3.174998,-3.174998 3.174998,3.174998 -3.174998,3.174999 m 32.808308,-3.174999 c 0,-5.841996 -4.741325,-10.583321 -10.583322,-10.583321 -2.37067,0 -4.550829,0.7832 -6.349996,2.116663 v 0 28.490318 c 1.248831,0.7408 2.688167,1.142999 4.233326,1.142999 4.677837,0 8.466666,-3.788829 8.466666,-8.466666 v -4.233326 0 c 2.561167,-1.926167 4.233326,-4.995333 4.233326,-8.466667 m -9.524994,3.174999 -3.174998,-3.174999 3.174998,-3.174998 3.174998,3.174998 z"
id="path1-5"
style="stroke-width:2.11666;fill:#e8f5e9" /></g></svg>
defaultAvatars/cat.svg
@@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="cat.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="1.846029"
inkscape:cx="2.7085165"
inkscape:cy="200.97192"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ff9800;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
fill="currentColor"
d="m 25.400001,16.40418 -2.815164,0.19048 C 20.764505,14.435662 15.663343,8.9958335 10.583346,8.9958335 c 0,0 -4.1698298,6.2653315 -0.08466,14.6261555 -1.1641649,1.756832 -1.8838307,2.666999 -2.0319978,4.762492 l -4.0851663,0.61384 0.4444956,2.074334 3.7253306,-0.550319 0.2963358,1.502838 -3.3231637,1.989663 0.9948328,1.88383 3.0691639,-1.88383 C 12.022678,39.179496 18.182173,41.804166 25.4,41.804166 c 7.217828,0 13.377323,-2.62467 15.811487,-7.789329 l 3.069164,1.88383 0.994833,-1.88383 -3.323164,-1.989663 0.296336,-1.502838 3.72533,0.550319 0.444496,-2.074334 -4.085163,-0.61384 c -0.148168,-2.095493 -0.867833,-3.00566 -2.031998,-4.762492 4.085163,-8.360824 -0.08466,-14.6261555 -0.08466,-14.6261555 -5.079996,0 -10.181158,5.4398285 -12.001491,7.5988265 l -2.815163,-0.19048 m -6.349995,6.349995 a 2.1166649,2.1166649 0 0 1 2.116664,2.116662 2.1166649,2.1166649 0 0 1 -2.116664,2.116662 2.1166649,2.1166649 0 0 1 -2.116665,-2.116662 2.1166649,2.1166649 0 0 1 2.116665,-2.116662 m 12.699989,0 a 2.1166649,2.1166649 0 0 1 2.116663,2.116662 2.1166649,2.1166649 0 0 1 -2.116664,2.116662 2.1166649,2.1166649 0 0 1 -2.116665,-2.116662 2.1166649,2.1166649 0 0 1 2.116665,-2.116662 m -8.46666,6.349995 h 4.23333 l -1.481665,2.942157 c 0.423333,1.354671 1.608665,2.349502 3.069163,2.349502 a 3.1749974,3.1749974 0 0 0 3.174998,-3.174997 h 1.058332 a 4.2333299,4.2333299 0 0 1 -4.23333,4.233332 c -1.587498,0 -2.96333,-0.867839 -3.704163,-2.11667 -0.740833,1.248831 -2.116665,2.11667 -3.704163,2.11667 a 4.2333299,4.2333299 0 0 1 -4.233331,-4.233332 h 1.058333 a 3.1749974,3.1749974 0 0 0 3.174998,3.174997 c 1.460498,0 2.64583,-0.994831 3.069164,-2.349502 z"
id="path1-5"
style="stroke-width:2.11666;fill:#fff3e0" /></g></svg>
defaultAvatars/cow.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="cow.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.8211031"
inkscape:cx="95.352773"
inkscape:cy="104.9235"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#8bc34a;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 22.224988,37.041662 a 1.0583332,1.0583332 0 0 1 1.058328,1.058336 1.0583332,1.0583332 0 0 1 -1.058328,1.058336 1.0583332,1.0583332 0 0 1 -1.058336,-1.058336 1.0583332,1.0583332 0 0 1 1.058336,-1.058336 m 6.349999,0 a 1.0583332,1.0583332 0 0 1 1.058328,1.058336 1.0583332,1.0583332 0 0 1 -1.058328,1.058336 1.0583332,1.0583332 0 0 1 -1.058336,-1.058336 1.0583332,1.0583332 0 0 1 1.058336,-1.058336 M 21.166652,22.225 a 2.1166665,2.1166665 0 0 1 2.116664,2.116664 2.1166665,2.1166665 0 0 1 -2.116664,2.116671 2.1166665,2.1166665 0 0 1 -2.116664,-2.116671 2.1166665,2.1166665 0 0 1 2.116664,-2.116664 m 8.466663,0 a 2.1166665,2.1166665 0 0 1 2.116672,2.116664 2.1166665,2.1166665 0 0 1 -2.116672,2.116671 2.1166665,2.1166665 0 0 1 -2.116664,-2.116671 2.1166665,2.1166665 0 0 1 2.116664,-2.116664 m 8.466671,14.816662 c 0,4.677832 -5.693831,8.466671 -12.699998,8.466671 -7.006168,0 -12.699999,-3.788839 -12.699999,-8.466671 0,-1.905 0.952496,-3.661831 2.54,-5.079999 -1.587504,-2.116664 -2.54,-4.762496 -2.54,-7.619999 l 0.254,-2.582328 c -1.143,0.31752 -2.51884,0.31752 -3.6406714,0 -2.159,-0.59264 -5.418664,-3.02684 -4.931832,-4.720167 0.4868,-1.693336 4.529664,-2.010832 6.6886634,-1.375832 1.24884,0.35984 2.582336,1.27 3.365504,2.243663 l 1.206504,-1.714503 c -1.27,-2.328328 -0.825504,-8.7841669 5.524495,-10.9008309 l -0.19048,0.29632 v 0 c -0.59264,0.931336 -2.116664,3.873495 -0.508,7.0484949 1.524,-0.63496 3.175,-0.994832 4.931832,-0.994832 1.756831,0 3.407831,0.35984 4.931831,0.994832 1.608664,-3.1749999 0.08464,-6.1171589 -0.508,-7.0484949 l -0.19048,-0.29632 c 6.349999,2.116664 6.794503,8.5725029 5.524503,10.9008309 L 36.364354,17.907 c 0.7832,-0.973663 2.116672,-1.883831 3.365504,-2.243663 2.159,-0.63496 6.201831,-0.31752 6.688663,1.375832 0.4868,1.693327 -2.772832,4.127495 -4.931831,4.720167 -1.121832,0.31752 -2.497664,0.31752 -3.640664,0 l 0.254,2.582328 c 0,2.857503 -0.952504,5.503335 -2.54,7.619999 1.587496,1.418168 2.54,3.174999 2.54,5.079999 M 25.400028,32.808335 c -4.677832,0 -8.466671,1.904999 -8.466671,4.233327 0,2.328336 3.788839,4.233336 8.466671,4.233336 4.677831,0 8.466663,-1.905 8.466663,-4.233336 0,-2.328328 -3.788832,-4.233327 -8.466663,-4.233327 m 0,-4.233336 c 2.370663,0 4.593167,0.44448 6.498167,1.185336 1.227664,-1.460504 1.968496,-3.302 1.968496,-5.418671 a 8.4666654,8.4666654 0 0 0 -8.466663,-8.466663 8.4666654,8.4666654 0 0 0 -8.466671,8.466663 c 0,2.116671 0.7408,3.958167 1.968503,5.418671 1.905,-0.7408 4.127496,-1.185336 6.498168,-1.185336 M 29.823859,5.5880021 Z"
id="path1-2"
style="stroke-width:2.11666;fill:#f1f8e9" /></g></svg>
defaultAvatars/dog.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="dog.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.8092114"
inkscape:cx="11.391097"
inkscape:cy="191.51282"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 38.100001,8.4666661 c -3.6195,0 -5.820833,0.69848 -7.090833,1.291168 -1.629834,-0.804336 -3.4925,-1.291168 -5.609168,-1.291168 -2.116666,0 -3.979333,0.4868 -5.609167,1.291168 -1.27,-0.59264 -3.471334,-1.291168 -7.090834,-1.291168 -6.3500006,0 -10.5833343,16.9333289 -10.5833343,21.1666659 0,1.756832 2.7940002,3.365504 6.6463338,4.021664 1.3546665,4.741337 7.7470005,8.360837 15.5786685,8.678337 v -9.059337 c -1.248833,-0.78312 -3.175,-2.201328 -3.175,-3.640664 0,-2.116664 4.233333,-2.116664 4.233333,-2.116664 0,0 4.233334,0 4.233334,2.116664 0,1.439336 -1.926166,2.857504 -3.175,3.640664 v 9.059337 c 7.831667,-0.31752 14.224001,-3.937 15.578668,-8.678337 3.852334,-0.65616 6.646334,-2.264832 6.646334,-4.021664 0,-4.233337 -4.233333,-21.1666659 -10.583335,-21.1666659 M 8.7841649,29.358164 c -1.058333,-0.254 -1.8838331,-0.55032 -2.4341665,-0.7832 0.5291664,-5.863161 4.6566666,-15.02833 6.4558346,-15.875002 1.143,0 2.010833,0.12696 2.794,0.2328 C 11.154832,17.822267 9.3979985,25.484604 8.7841649,29.3581 M 19.05,25.399995 a 2.1166669,2.1166669 0 0 1 -2.116667,-2.116664 c 0,-1.143 0.9525,-2.116664 2.116667,-2.116664 a 2.1166669,2.1166669 0 0 1 2.116667,2.116664 c 0,1.185336 -0.9525,2.116664 -2.116667,2.116664 m 12.700001,0 a 2.1166669,2.1166669 0 0 1 -2.116667,-2.116664 c 0,-1.143 0.9525,-2.116664 2.116667,-2.116664 a 2.1166669,2.1166669 0 0 1 2.116667,2.116664 c 0,1.185336 -0.9525,2.116664 -2.116667,2.116664 m 10.265834,3.958169 c -0.613832,-3.873496 -2.370666,-11.535833 -6.815667,-16.42533 0.783168,-0.10584 1.651,-0.23288 2.794,-0.23288 1.799167,0.846672 5.926667,10.011841 6.455835,15.875002 -0.529168,0.23288 -1.354668,0.5292 -2.434168,0.7832 z"
id="path1-7"
style="stroke-width:2.11666;fill:#efebe9" /></g></svg>
defaultAvatars/dolphin.svg
@@ -1,84 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="dolphin.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12"><circle
style="fill:#03a9f4;stroke-width:3.175;stroke-miterlimit:8"
id="circle13"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#03a9f4;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 40.217144,19.049629 c 0,0 0,-8.466772 -10.583462,-8.466772 -3.238534,0 -6.032568,0.402164 -8.466765,1.058348 -1.058348,-0.931347 -7.91643,-6.7543678 -14.8168398,0.148162 l 5.4187278,5.418728 c -8.5937668,9.313447 -5.4187278,25.125132 -5.4187278,25.125132 0,0 -6.3500772,0 -6.3500772,8.466772 0,0 8.4667662,-2.116697 8.4667662,-2.116697 0,0 8.4667648,2.116697 8.4667648,2.116697 0,-8.466772 -6.350076,-8.466772 -6.350076,-8.466772 0,0 1.79919,-12.192146 14.816849,-14.435836 v 5.969071 c 4.233378,0 5.672731,-3.831214 6.117241,-6.350076 h 4.466213 c 8.466772,0 10.583462,-2.116689 10.583462,-4.233386 0,-2.116689 -4.233379,-4.233379 -6.350076,-4.233379 m -4.233386,2.11669 c -1.164174,0 -2.11669,-0.952516 -2.11669,-2.11669 0,-1.164181 0.952516,-2.116697 2.11669,-2.116697 1.164182,0 2.116697,0.952516 2.116697,2.116697 0,1.164174 -0.952515,2.11669 -2.116697,2.11669 z"
id="path1-3"
style="stroke-width:2.11669;fill:#e1f5fe"
clip-path="url(#clipPath12)" /></g></svg>
defaultAvatars/donkey.svg
@@ -1,85 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="donkey.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.7889873"
inkscape:cx="117.97347"
inkscape:cy="97.651422"
inkscape:current-layer="layer1"
showguides="false" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 45.163941,32.490816 -0.14816,-0.14816 -0.19048,-0.190481 -6.731006,-6.752173 v -2.116666 a 1.0583343,1.0583343 0 0 0 -1.058329,-1.058337 c -0.29632,0 -0.59264,0.12704 -0.7832,0.33864 l -7.768175,7.069678 H 14.810915 c -1.439337,0 -2.772835,0.740801 -3.556004,1.947338 l -5.7150065,5.651501 c -0.6984966,0.952505 -0.4868324,2.264834 0.465664,2.984506 0.7196649,0.508001 1.7145056,0.529201 2.4553386,0 l 2.1166649,-1.968505 v 12.551842 h 6.350007 v -8.466671 h 10.583345 v 8.466671 h 6.350005 V 39.856822 c 0,-1.121833 0.44448,-2.20133 1.248833,-2.984499 l 2.984499,-3.005666 4.233339,2.116666 v 0 c 0.317521,0.16936 0.677361,0.2752 1.058337,0.2752 1.270001,-0.0424 2.30717,-1.100673 2.286002,-2.391834 -0.0216,-0.508001 -0.16936,-0.994841 -0.508,-1.375841 z"
id="path1-5"
style="stroke-width:2.11667;fill:#fafafa"
clip-path="url(#clipPath1)" /></g></svg>
defaultAvatars/duck.svg
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="duck.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 21.418441,16.933333 a 3.1750002,3.1750002 0 0 0 -3.175,3.175001 3.1750002,3.1750002 0 0 0 3.175,3.175 3.1750002,3.1750002 0 0 0 3.175001,-3.175 3.1750002,3.1750002 0 0 0 -3.175001,-3.175001 m 3.175001,-6.35 A 10.583334,10.583334 0 0 1 35.17677,21.16667 c 0,3.598328 -1.79916,6.773328 -4.529664,8.678328 3.344336,0.31752 7.112001,1.079505 10.879665,2.963337 6.350008,3.175 8.466673,-1.058336 8.466673,-1.058336 0,0 -2.116665,19.050001 -14.816674,19.050001 H 22.476769 c 0,0 -10.583328,0 -10.583328,-10.583329 0,-6.35 6.35,-8.466672 4.233328,-12.700001 -8.4666644,0 -8.4666644,-7.408336 -8.4666644,-7.408336 2.1166669,1.058336 4.7413364,1.058336 6.3500004,0.31752 0.40216,-5.503337 4.995336,-9.842505 10.583337,-9.842505 z"
id="path1-2"
style="fill:#f57f17;stroke-width:2.11666"
clip-path="url(#clipPath2)" /></g></svg>
defaultAvatars/elephant.svg
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="elephant.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.0988174"
inkscape:cx="80.675938"
inkscape:cy="135.21287"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#cddc39;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#cddc39;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 37.041661,36.923702 a 1.0583333,1.0583333 0 0 1 -1.058336,1.058336 1.0583333,1.0583333 0 0 1 -1.058328,-1.058336 V 22.107039 c 0,-4.085167 -4.381503,-7.408335 -8.466671,-7.408335 H 8.4666629 A 8.4666657,8.4666657 0 0 0 0,23.165375 V 44.332038 H 8.4666629 V 35.865374 H 19.049998 v 8.466664 h 8.466664 v -9.525 a 1.0583333,1.0583333 0 0 1 1.058336,-1.058336 1.0583333,1.0583333 0 0 1 1.058328,1.058336 v 3.175 a 6.3499996,6.3499996 0 0 0 6.349999,6.35 6.3499996,6.3499996 0 0 0 6.35,-6.35 v -4.233336 h -5.291664 z"
id="path1-2"
style="fill:#827717;stroke-width:2.11666"
clip-path="url(#clipPath1)" /></g></svg>
defaultAvatars/fish.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="fish.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.8928896"
inkscape:cx="38.024265"
inkscape:cy="171.80054"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#3f51b5;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 25.400002,41.275 1.608664,-6.35 c -6.900332,-0.44448 -13.059833,-3.386672 -14.837833,-7.239 -0.190504,1.016 -0.465664,1.947328 -0.889,2.645832 -1.3969995,2.476496 -4.2333334,2.476496 -7.0484998,2.476496 2.3283335,0 3.1750004,-3.323168 3.1750004,-7.408328 0,-4.085168 -0.8466669,-7.408336 -3.1750004,-7.408336 2.8151664,0 5.6515003,0 7.0484998,2.476496 0.423336,0.69848 0.698496,1.62984 0.889,2.64584 1.375833,-3.005672 5.439832,-5.43984 10.392834,-6.561672 L 19.049999,9.5249996 c 4.233335,0 8.466667,0 11.281835,1.4181604 2.391832,1.185336 3.767664,3.386672 4.995336,5.736168 6.180664,1.481672 11.239496,4.826 11.239496,8.720672 0,3.979328 -5.291664,7.408328 -11.641664,8.805328 -1.756832,2.328336 -3.471336,4.487336 -4.931831,5.651504 C 28.215171,41.275 26.81817,41.275 25.400003,41.275 m 10.583335,-19.05 a 2.1166667,2.1166667 0 0 0 -2.116672,2.116664 2.1166667,2.1166667 0 0 0 2.116672,2.116664 2.1166667,2.1166667 0 0 0 2.116664,-2.116664 A 2.1166667,2.1166667 0 0 0 35.983338,22.225 Z"
id="path1-2"
style="fill:#e8eaf6;stroke-width:2.11666" /></g></svg>
defaultAvatars/horse.svg
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="horse.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2235234"
inkscape:cx="93.686306"
inkscape:cy="103.61333"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#ff9800;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#f44336;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 43.360002,20.139465 v 14.816663 l -6.35,2.116655 -6.519322,-10.413994 c -0.550399,-0.888959 -1.947343,-0.508 -1.947343,0.5504 v 15.155334 c 0,4.148654 -1.650992,7.873995 -4.233326,10.710314 V 83.639489 H 13.726689 V 58.239505 c -0.33872,0 -0.67728,0 -1.0584,0 -0.888959,0 -1.777998,-0.126399 -2.624669,-0.254079 L -8.7523666,54.852757 -13.493692,63.361759 -9.4296946,83.63941 H -20.140024 L -24.37335,63.531086 c -0.1264,-1.269919 0,-2.539997 0.67728,-3.64067 l 4.317997,-7.662315 c -4.148669,-2.328334 -6.984987,-6.688668 -7.111995,-11.726329 -0.16928,0.635041 -0.25392,1.5664 -0.1264,2.920991 0.1264,1.862671 0.592639,4.614334 0.296319,7.662332 -0.169279,3.047998 -1.566399,6.180667 -3.344333,8.255003 -1.820287,2.074319 -3.80995,3.513662 -5.926621,4.614317 l -2.963326,-2.963326 c 0.80432,-1.989663 1.608655,-3.767663 1.777999,-5.41867 0.25408,-1.566398 -0.0416,-2.836317 -0.508,-3.979325 l -2.243678,-4.783661 c -0.88896,-2.159007 -1.989663,-5.291661 -1.777999,-8.974667 0.1264,-3.598334 2.11667,-8.297323 5.884332,-10.879657 3.809998,-2.582334 7.916331,-2.92099 11.260665,-2.243663 2.116671,0.42336 4.275662,1.439359 6.138332,2.878671 1.566399,-0.71968 3.386654,-1.10064 5.291661,-1.10064 H 11.61053 v -2.11667 c 0,-9.355659 7.57766,-16.9333191 16.933319,-16.9333191 h 14.816663 l -3.76766,5.6726691 c 2.286,1.524 3.76766,4.106318 3.76766,7.027325 z"
id="path1-7"
style="stroke-width:4.23333;fill:#ffebee"
clip-path="url(#clipPath1)" /></g></svg>
defaultAvatars/jellyfish.svg
@@ -1,70 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="jellyfish.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.0122333"
inkscape:cx="93.618245"
inkscape:cy="134.78372"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#9c27b0;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#9c27b0;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 41.275115,34.118313 c -1.227673,-0.148161 -2.264849,0.889007 -2.116679,2.11668 0,1.418178 -2.11668,1.418178 -2.11668,0 V 31.36662 l 3.598355,-1.058336 c 1.524011,-0.719685 2.561187,-2.159016 2.751692,-3.810028 0,-11.430086 -8.043396,-18.838478 -17.991807,-18.838478 -9.948403,0 -17.9917989,7.408392 -17.9917989,18.838478 0.127041,1.69334 1.185345,3.175023 2.7516849,3.810028 l 3.598363,1.058336 v 4.868373 a 1.0583413,1.0583413 0 0 1 -1.058344,1.058344 1.0583413,1.0583413 0 0 1 -1.058336,-1.058344 c 0.148161,-1.227673 -0.889007,-2.264849 -2.1166879,-2.11668 -1.227673,-0.148161 -2.264849,0.889007 -2.11668,2.11668 -0.127041,2.984526 2.307185,5.418704 5.2917039,5.291704 2.984526,0.12704 5.418712,-2.307178 5.291711,-5.291704 v -3.810029 h 2.11668 v 12.065091 c 0,1.418178 -2.11668,1.418178 -2.11668,0 0.148162,-1.227673 -0.889006,-2.264849 -2.116687,-2.11668 -1.227674,-0.148161 -2.264849,0.889007 -2.11668,2.11668 -0.254002,3.048023 2.222512,5.651546 5.291703,5.503377 2.984527,0.127041 5.418713,-2.307185 5.291712,-5.291712 V 33.059969 h 2.11668 V 44.70172 c -0.127041,2.984527 2.307185,5.418713 5.291704,5.291712 2.984526,0.127041 5.418713,-2.307185 5.291712,-5.291712 0,-2.815181 -4.233368,-2.815181 -4.233368,0 0,1.418179 -2.11668,1.418179 -2.11668,0 V 32.63663 h 2.11668 v 3.810028 c 0,2.878694 2.39185,5.207039 5.291704,5.080039 2.984526,0.12704 5.418712,-2.307178 5.291711,-5.291704 0.148161,-1.227673 -0.889006,-2.264849 -2.116688,-2.11668 M 22.436646,13.374821 c -3.196192,0.698485 -5.947885,2.688188 -7.620057,5.503377 -0.359843,0.423363 -1.058344,0.571525 -1.481684,0.211682 -0.465683,-0.359843 -0.550324,-1.016008 -0.211681,-1.481683 2.032015,-3.196184 5.228207,-5.461041 8.890067,-6.350048 0.571524,-0.0424 1.079512,0.317522 1.270009,0.846678 0.127041,0.571525 -0.254002,1.164177 -0.84667,1.27001 z"
id="path1-5"
style="stroke-width:2.11668;fill:#f3e5f5"
clip-path="url(#clipPath2)" /></g></svg>
defaultAvatars/kangaroo.svg
@@ -1,77 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="kangaroo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.0122333"
inkscape:cx="93.618247"
inkscape:cy="134.78372"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#9c27b0;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5"><circle
style="fill:#cddc39;stroke-width:3.175;stroke-miterlimit:8"
id="circle6"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#cddc39;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 37.909115,21.60052 -1.693333,2.920994 v 4.381488 l -2.772826,3.323162 -0.804335,3.471329 -2.772827,1.587493 -1.058326,-1.86266 1.989661,-1.12183 0.550319,-2.412996 v 0 l 0.148159,-0.634958 v 0 0 l 1.481661,-1.777997 c 0.38104,-0.444479 0.31752,-1.121838 -0.127039,-1.481669 -0.444479,-0.38096 -1.12183,-0.31752 -1.502829,0.127039 l -1.799165,2.158996 -0.613839,2.624667 c -0.381039,0.0632 -0.761999,0.14816 -1.185334,0.14816 -1.460501,0 -2.793994,-0.507999 -3.746497,-1.269997 -0.169359,2.751666 -1.058326,5.101158 -2.328323,6.413492 l -3.450162,3.725329 -1.142998,7.619985 -4.000496,2.561155 -1.142998,-1.756828 3.196162,-2.074324 0.97367,-6.921491 v -0.0216 l 1.058326,-2.899795 c -1.121758,-0.973342 -1.947252,-2.666675 -2.370587,-4.741007 l -0.35984,0.656159 c -0.761998,1.354669 -1.502829,2.730499 -2.434163,4.127496 -0.952502,1.354661 -1.904997,2.836323 -3.7676572,3.979321 C 7.3021648,43.042271 5.947503,43.296303 4.825665,43.063471 3.64034,42.809472 2.645509,42.068633 2.052839,41.285475 0.88867295,39.676806 0.55000895,38.025809 0.23251395,36.480644 L 2.28567,35.930325 c 0.486879,1.354669 1.121838,2.730499 1.926165,3.471329 0.804334,0.698479 1.460501,0.550319 2.0319958,0 0.677358,-0.571519 1.333501,-1.799156 1.883828,-3.069154 0.571519,-1.291166 1.037166,-2.688163 1.523997,-4.127496 1.0159982,-2.878659 1.9896692,-5.884325 3.7041612,-8.974647 0.888999,-1.523997 1.968501,-3.111498 3.640665,-4.529664 1.650997,-1.418157 3.831153,-2.582323 6.519316,-2.582323 2.688163,0 5.714989,2.582323 7.577658,4.952991 0.888998,1.164166 2.730491,1.015998 3.471321,-0.2752 l 1.947333,-3.344329 c -0.29632,-0.10584 -0.529199,-0.2752 -0.740799,-0.4868 -0.825502,-0.846662 -0.825502,-2.158996 0,-2.96333 l 2.412996,2.391836 c 0.0632,0 0.148159,-0.0424 0.148159,-0.0424 0.867831,0 1.587493,0.507999 1.926165,1.227661 l 2.307155,4.889479 -2.11666,1.058326 z"
id="path1-5"
style="stroke-width:2.11666;fill:#827717"
clip-path="url(#clipPath5)" /></g></svg>
defaultAvatars/koala.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="koala.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#8bc34a;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 40.216666,10.58334 c -1.905,0 -7.408335,0 -9.948334,6.561664 -0.846664,-0.21168 -1.905,-0.21168 -2.751664,-0.21168 h -4.233335 c -0.846664,0 -1.904999,0 -2.751663,0.21168 -2.54,-6.561672 -8.043335,-6.561672 -9.948334,-6.561672 -2.1166643,0 -8.4666645,2.116672 -8.4666645,12.699998 0,7.619999 5.2916642,9.736671 8.4666645,10.37167 v 2.328336 c 0,6.984999 5.714999,12.699997 12.699997,12.699997 h 4.233335 c 6.984999,0 12.699998,-5.714998 12.699998,-12.699997 V 33.655 c 3.174999,-0.634959 8.466662,-2.751663 8.466662,-10.371662 0,-10.583334 -6.349999,-12.699998 -8.466662,-12.699998 m -29.63333,19.049997 v 0.846664 c -4.4449993,-1.27 -3.5983323,-6.138335 -1.4816643,-7.831662 -0.63504,-0.846672 -2.751668,0.634959 -2.751668,-0.21168 0,-1.058328 3.8099963,-2.54 4.4449963,-2.751664 -0.63504,-1.058336 -3.1750003,-0.63496 -3.1750003,-1.481664 0,-0.634959 2.5400003,-1.693335 4.6566713,-1.269999 1.058328,0.21168 2.328328,0.63496 3.386664,1.481663 -2.963336,2.751664 -5.079999,6.561663 -5.079999,11.218334 m 7.408334,6.349999 c -4.233335,0 -4.233335,-6.349999 0,-6.349999 4.233327,0 4.233327,6.349999 0,6.349999 m 8.466663,6.349999 h -2.116664 c -1.481672,0 -2.54,-1.481672 -1.905,-2.751672 l 1.481664,-6.349999 c 0.21168,-0.846663 1.058336,-1.269999 1.693336,-1.481663 0.63504,0 1.269999,0.42336 1.693327,1.481663 l 1.481672,6.349999 c 0.21168,1.27 -0.846672,2.751672 -2.328335,2.751672 m 6.349998,-6.349999 c -4.233335,0 -4.233335,-6.349999 0,-6.349999 4.233335,0 4.233335,6.349999 0,6.349999 m 8.889998,-13.546669 c 2.116672,1.693335 2.963336,6.56167 -1.481663,7.83167 0.21168,-4.656671 -1.905,-9.10167 -5.079999,-11.853334 1.058328,-0.846663 2.328327,-1.269999 3.386663,-1.481663 2.116664,-0.42336 4.656671,0.42336 4.656671,1.269999 0,0.846664 -2.540007,0.42336 -3.175007,1.27 0.63496,0.42336 4.445007,1.905 4.445007,2.963328 0,0.846671 -1.905,-0.63496 -2.751672,0 z"
id="path1-5"
style="stroke-width:2.11666;fill:#f1f8e9" /></g></svg>
defaultAvatars/mouse.svg
@@ -1,63 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="mouse.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.6965465"
inkscape:cx="231.77794"
inkscape:cy="89.002729"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 40.91516,30.458833 c 2.963335,2.688167 0.994832,7.641166 -2.984496,7.641166 H 19.176996 c -5.947831,0 -10.7103259,-4.762495 -10.7103259,-10.710333 v -0.10584 C 3.598335,26.288994 0,22.034499 0,16.933332 0,11.112501 4.698999,6.3499987 10.583334,6.3499987 h 5.291663 c 0.63504,0 1.058336,-0.4868 1.058336,-1.058336 0,-0.57152 -0.42336,-1.058328 -1.058336,-1.058328 H 10.583334 V 0 h 5.291663 c 2.920999,0 5.291671,2.391832 5.291671,5.2916627 0,2.9421667 -2.370672,5.2916703 -5.291671,5.2916703 h -5.291663 c -3.5136629,0 -6.349999,2.815167 -6.349999,6.349999 0,2.899831 1.947336,5.291663 4.5296631,6.07483 1.185336,-4.656663 5.3551669,-8.191502 10.4139979,-8.191502 1.693336,0 3.386671,0.46568 4.868335,1.164168 -2.984503,1.672167 -4.995335,4.762503 -4.995335,8.36083 0,2.64584 1.058336,5.016503 2.815168,6.709839 l 1.481663,-1.481672 c -1.375831,-1.291168 -2.180159,-3.174999 -2.180159,-5.228167 0,-5.482159 4.952999,-7.408326 7.408326,-7.408326 4.402671,0 8.360831,4.000495 7.281335,8.953494 l 5.058831,4.571999 m -7.048495,3.407831 c 1.185328,0 2.116664,-0.931328 2.116664,-2.116663 0,-1.185336 -0.931336,-2.116664 -2.116664,-2.116664 -1.185336,0 -2.116671,0.931328 -2.116671,2.116664 0,1.185335 0.931335,2.116663 2.116671,2.116663 z"
id="path1-5"
style="stroke-width:2.11666;fill:#fbe9e7"
clip-path="url(#clipPath4)" /></g></svg>
defaultAvatars/owl.svg
@@ -1,56 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="owl.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 25.399997,35.98334 c 1.185336,1.778 2.772841,3.238504 4.656673,4.233337 l -4.656673,4.656665 -4.656665,-4.656665 c 1.883832,-0.994833 3.492505,-2.455337 4.656665,-4.233337 M 35.983335,25.823337 a 4.2333344,4.2333344 0 0 0 -4.233337,4.233337 4.2333344,4.2333344 0 0 0 4.233337,4.233329 4.2333344,4.2333344 0 0 0 4.233338,-4.233329 c 0,-2.349504 -1.905001,-4.233337 -4.233338,-4.233337 m -21.166669,0 a 4.2333344,4.2333344 0 0 0 -4.233337,4.233337 4.2333344,4.2333344 0 0 0 4.233337,4.233329 4.2333344,4.2333344 0 0 0 4.233329,-4.233329 c 0,-2.349504 -1.905,-4.233337 -4.233329,-4.233337 m 21.166669,-5.291665 a 8.4666684,8.4666684 0 0 1 8.466675,8.466666 8.4666684,8.4666684 0 0 1 -8.466675,8.466666 8.4666684,8.4666684 0 0 1 -8.466666,-8.466666 8.4666684,8.4666684 0 0 1 8.466666,-8.466666 m -21.166669,0 a 8.4666684,8.4666684 0 0 1 8.466666,8.466666 8.4666684,8.4666684 0 0 1 -8.466666,8.466666 8.4666684,8.4666684 0 0 1 -8.4666702,-8.466666 8.4666684,8.4666684 0 0 1 8.4666702,-8.466666 M 4.7413288,4.2333319 C 8.4666648,12.064998 5.7784948,17.906999 3.2808278,23.706673 2.5188281,25.400001 2.1166616,27.156841 2.1166616,28.998338 A 12.700003,12.700003 0 0 0 14.816666,41.698341 c 0.444481,-0.0216 0.889001,-0.0424 1.333497,-0.10584 l 6.265337,6.265337 2.984497,2.942161 2.984505,-2.942161 6.265337,-6.265337 c 0.44448,0.0632 0.889,0.08464 1.333496,0.10584 A 12.700003,12.700003 0 0 0 48.683339,28.998338 c 0,-1.841497 -0.402161,-3.598337 -1.164169,-5.291665 C 45.021506,17.906999 42.333337,12.064998 46.058674,4.2333319 40.470673,8.5936689 32.511999,12.04383 25.399997,12.064998 18.287995,12.044198 10.329329,8.5936689 4.7413288,4.2333319 Z"
id="path1-7"
style="stroke-width:2.11666;fill:#e0f2f1"
clip-path="url(#clipPath4)" /></g></svg>
defaultAvatars/panda.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="panda.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 25.4043,11.112501 c 3.683,0 7.112,1.058327 10.033,2.857495 1.354672,-1.735664 3.471336,-2.857495 5.842,-2.857495 a 7.4083335,7.4083335 0 0 1 7.408336,7.408326 c 0,3.175 -2.010832,5.884336 -4.826,6.942672 0.38104,1.524 0.59264,3.06916 0.59264,4.699 a 19.05,19.05 0 0 1 -19.05,19.05 19.05,19.05 0 0 1 -19.0500002,-19.05 c 0,-1.62984 0.21168,-3.175 0.59264,-4.699 -2.815168,-1.058336 -4.826,-3.767672 -4.826,-6.942672 a 7.4083335,7.4083335 0 0 1 7.408328,-7.408326 c 2.3706722,0 4.4873362,1.121831 5.8420002,2.857495 2.921,-1.799168 6.35,-2.857495 10.033,-2.857495 m 0,4.233326 A 14.816667,14.816667 0 0 0 10.58758,30.162499 14.816667,14.816667 0 0 0 25.404244,44.979163 14.816667,14.816667 0 0 0 40.220916,30.162499 14.816667,14.816667 0 0 0 25.404244,15.345827 m 8.86884,11.218336 c 0.762,2.815168 -0.23288,5.524496 -2.201336,6.053664 -1.989664,0.55032 -4.191,-1.312328 -4.953,-4.148664 -0.762,-2.815168 0.2328,-5.524504 2.201336,-6.053664 1.989664,-0.5292 4.191,1.312328 4.953,4.148664 m -17.737672,0 c 0.762,-2.836336 2.963336,-4.677832 4.953,-4.148664 1.968504,0.52912 2.963336,3.238496 2.201336,6.053664 -0.762,2.836336 -2.963336,4.699 -4.953,4.148664 -1.968504,-0.5292 -2.963336,-3.238496 -2.201336,-6.053664 m 8.868832,7.831664 c 1.27,0 2.39184,0.40216 3.175,1.058336 l -2.116664,2.116664 c 0,0.889 0.71968,1.587504 1.587504,1.587504 a 1.5875,1.5875 0 0 0 1.587496,-1.587504 1.0583334,1.0583334 0 0 1 1.058336,-1.058328 1.0583334,1.0583334 0 0 1 1.058328,1.058328 3.7041668,3.7041668 0 0 1 -3.70416,3.704168 c -1.037168,0 -1.968504,-0.42336 -2.64584,-1.121832 -0.67736,0.69848 -1.608664,1.121832 -2.645832,1.121832 a 3.7041668,3.7041668 0 0 1 -3.704168,-3.704168 1.0583334,1.0583334 0 0 1 1.058336,-1.058328 1.0583334,1.0583334 0 0 1 1.058336,1.058328 1.5875,1.5875 0 0 0 1.587496,1.587504 1.5875,1.5875 0 0 0 1.587504,-1.587504 l -2.116672,-2.116664 c 0.7832,-0.65616 1.905,-1.058336 3.175,-1.058336 z"
id="path1-7"
style="stroke-width:2.11666;fill:#fafafa" /></g></svg>
defaultAvatars/penguin.svg
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="penguin.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 30.941406,21.901154 c -0.889006,0.592644 -3.70419,2.201349 -4.127529,2.518847 -0.825501,0.656164 -1.587505,0.613844 -2.413014,-0.0208 -0.423362,-0.338642 -3.238515,-1.947339 -4.12752,-2.518847 -1.016006,-0.656164 -0.95251,-1.481672 0.169361,-1.947339 3.471356,-1.460513 6.942713,-1.35468 10.392893,0.0632 1.037174,0.444483 1.07951,1.270008 0.105841,1.905011 M 46.223864,37.310654 C 44.255356,32.886795 41.567172,28.8651 38.095816,25.330247 36.973977,24.166072 36.275477,22.853736 35.852139,21.350887 35.640457,20.652403 35.492297,19.932719 35.344136,19.213043 34.920773,17.350368 34.730292,15.445356 33.862463,13.688514 32.317286,10.344158 29.629102,8.6084839 25.734415,8.4603149 c -3.831191,0.105841 -6.688712,1.7145061 -8.36089,5.0800301 -0.444482,0.910173 -0.762004,1.862675 -0.973669,2.836345 -0.359842,1.608681 -0.677364,3.280859 -1.058343,4.910701 -0.317521,1.37584 -0.952501,2.561183 -2.032012,3.619517 -3.407852,3.323188 -6.138367,7.13321 -8.212712,11.324235 -0.296338,0.613844 -0.5926676,1.227679 -0.7831728,1.862683 -0.4021703,1.397008 0.6138358,2.370678 2.0955128,2.032012 0.931336,-0.190481 1.862677,-0.381042 2.751682,-0.656164 0.867837,-0.317522 1.206503,-0.10584 1.418177,0.740805 1.37584,4.550859 4.381522,7.747046 8.974717,9.525056 8.720723,3.30202 18.901944,-1.397008 21.103293,-9.694393 0.14816,-0.571524 0.359842,-0.783205 0.994837,-0.571524 0.973678,0.296322 1.968516,0.508003 2.963354,0.740805 1.037174,0.190481 1.799179,-0.338642 1.947347,-1.354672 0.0632,-0.550324 -0.12704,-1.037174 -0.338642,-1.545177"
id="path1-6"
style="fill:#e0f7fa;stroke-width:2.11668" /></g></svg>
defaultAvatars/pig.svg
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="pig.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.5738353"
inkscape:cx="123.1625"
inkscape:cy="130.15596"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 37.740147,22.224997 -4.80484,-4.804832 c 0.14816,-0.889001 0.38104,-1.714505 0.67736,-2.434169 0.16936,-0.38096 0.254,-0.7832 0.254,-1.227664 0,-1.756832 -1.418169,-3.175 -3.175001,-3.175 -3.471336,0 -6.540504,1.672168 -8.466664,4.233328 H 11.641665 C 5.207,14.81666 0,20.023669 0,26.458333 0,32.892998 5.291664,50.799999 5.291664,50.799999 h 11.641665 v -4.233328 h 4.233337 v 4.233328 H 32.80833 l 3.556001,-11.832169 5.969,-1.989664 V 22.224997 h -4.59316 m -8.106841,7.408336 c -1.164168,0 -2.116664,-0.952504 -2.116664,-2.116664 0,-1.164168 0.952496,-2.116672 2.116664,-2.116672 1.164168,0 2.116672,0.952504 2.116672,2.116672 0,1.16416 -0.952504,2.116664 -2.116672,2.116664 z"
id="path1-9"
style="stroke-width:2.11666;fill:#fce4ec"
clip-path="url(#clipPath3)" /></g></svg>
defaultAvatars/rabbit.svg
@@ -1,56 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="rabbit.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.2511626"
inkscape:cx="85.289262"
inkscape:cy="161.69423"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="M 33.161072,50.800007 27.382562,40.76699 c 0,-3.661838 -2.264837,-6.011338 -5.016508,-6.011338 -1.905004,0 -3.556007,1.05833 -4.402675,2.624669 0.698498,-0.402161 1.524003,-0.613841 2.391838,-0.613841 2.751672,0 4.995342,2.243667 4.995342,4.995344 0,2.772837 -2.222504,5.037673 -4.995342,5.037673 h 6.985011 v 4.000502 H 9.3273642 c -0.508001,0 -1.037169,-0.19048 -1.41817,-0.592641 -0.783169,-0.783201 -0.783169,-2.053163 0,-2.836332 v 0 l 1.058336,-1.058338 c -0.719666,-0.317521 -1.312336,-0.804338 -1.905004,-1.312338 -0.465664,1.058337 -1.524002,1.799171 -2.751671,1.799171 -1.6510019,0 -3.0056708,-1.354667 -3.0056708,-3.026837 0,-1.651003 1.3546689,-3.005678 3.0056708,-3.005678 l 0.994835,0.169361 v -4.169839 c 0,-5.545674 4.466175,-10.033017 10.0330178,-10.033017 h 0.04232 c 4.487341,0.0216 7.979847,1.778003 7.979847,-0.994834 0,-1.968507 0.423337,-2.751677 1.143002,-3.852342 -1.54517,-0.719682 -3.302005,-1.16417 -5.143509,-1.16417 -1.121835,0 -2.010837,-0.889002 -2.010837,-2.010836 0,-0.910169 0.592665,-1.672171 1.418169,-1.926171 l -1.418155,-0.08464 c -1.100669,0 -2.010837,-0.889003 -2.010837,-1.98967 0,-1.121841 0.910168,-2.010843 2.010837,-2.010843 h 2.010837 c 4.445008,0 8.339681,2.434173 10.435184,6.032516 l 0.592665,-0.0216 c 1.502836,0 2.899839,0.486801 4.042841,1.29117 l 0.952501,0.80433 c 4.593175,4.127511 4.021674,6.921515 4.021674,6.942683 0,2.709333 -2.243671,4.931841 -4.974175,4.931841 l -1.037166,-0.10584 v 0.16936 c 0,2.3495 -1.016002,4.445007 -2.603504,5.926674 l 7.006178,12.128516 h -4.635508 m 0.232832,-28.067047 c -1.121835,0 -2.010837,0.889001 -2.010837,1.989675 0,1.121834 0.889002,2.010836 2.010837,2.010836 1.100669,0 2.010837,-0.889002 2.010837,-2.010836 0,-1.100674 -0.910168,-1.989675 -2.010837,-1.989675 z"
id="path1-7"
style="fill:#e0f2f1;stroke-width:2.11667"
clip-path="url(#clipPath3)" /></g></svg>
defaultAvatars/sea-turtle.svg
@@ -1,91 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="sea-turtle.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="5.2352457"
inkscape:cx="76.596215"
inkscape:cy="103.52905"
inkscape:current-layer="layer1"
showguides="false" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5"><circle
style="fill:#4caf50;stroke-width:3.175;stroke-miterlimit:8"
id="circle6"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 17.928156,13.324415 c 1.015999,-0.592639 2.116662,-1.079503 3.238494,-1.418167 V 9.1969136 c 0,-2.328327 1.841503,-4.2333258 4.16983,-4.2968298 2.455334,0.0632 4.296837,1.9685028 4.296837,4.2968299 v 2.7093343 c 1.121832,0.35984 2.222495,0.825504 3.238494,1.418167 l -3.386662,4.487335 h -8.170331 l -3.386662,-4.487335 m 22.288483,12.805826 c 0,1.058336 -0.105839,2.010831 -0.296319,2.963334 l -5.355157,-1.650999 -2.518831,-7.746996 3.386662,-4.466165 c 0.910168,0.846663 1.714495,1.799166 2.412999,2.857502 1.672167,-0.14816 3.28083,0.105841 4.720165,0.825495 2.180167,1.121833 3.66183,3.259663 4.000494,5.69383 l -6.349997,0.762 c 0,0.254 0,0.507999 0,0.761999 m -29.633311,0 c 0,-0.254 0,-0.508 0,-0.740799 l -6.349996,-0.7832 c 0.33864,-2.434167 1.820327,-4.571997 4.000494,-5.69383 1.439335,-0.719678 3.069165,-0.973662 4.6355,-0.698478 0.69848,-1.079504 1.502831,-2.074336 2.455327,-2.942168 l 3.428998,4.402661 -2.518831,7.768164 -5.355165,1.650999 c -0.19048,-0.952504 -0.296319,-1.904999 -0.296319,-2.963335 m 11.091322,-5.143493 h 7.450667 l 2.307159,7.111997 -6.032492,4.381494 -6.032501,-4.381494 2.307167,-7.111997 m -4.466166,9.482659 6.603996,4.783663 v 5.609163 C 22.606009,40.735208 21.441842,40.460088 20.362346,40.05792 l -2.603502,5.841997 c -2.243663,-0.99484 -3.852334,-3.047999 -4.275662,-5.460997 -0.29632,-1.608671 -0.0424,-3.217334 0.67736,-4.656669 -0.952496,-1.100663 -1.735663,-2.328327 -2.328327,-3.682998 l 5.376325,-1.629832 m 16.382991,0 5.376333,1.629832 c -0.59264,1.354672 -1.375831,2.582335 -2.328335,3.682998 0.71968,1.439335 0.973672,3.047998 0.69848,4.656669 -0.44448,2.412998 -2.053167,4.466158 -4.29683,5.460997 L 30.458845,40.05792 c -1.121832,0.402161 -2.243663,0.761999 -3.471334,0.888999 v -5.693835 z"
id="path1-6"
style="fill:#e0f2f1;stroke-width:2.11666" /></g></svg>
defaultAvatars/shark.svg
@@ -1,56 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="shark.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="1.9897878"
inkscape:cx="118.60561"
inkscape:cy="128.65694"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 46.566647,39.440406 v 4.233336 h -4.233328 c -2.963336,0 -5.926672,-0.846672 -8.466672,-2.116672 -5.291663,2.751672 -11.641663,2.751672 -16.933327,0 -2.54,1.27 -5.503335,2.116672 -8.4666708,2.116672 h -4.233328 v -4.233336 h 4.233328 c 2.9633358,0 5.9266708,-1.058336 8.4666708,-2.751663 5.08,3.598327 11.853328,3.598327 16.933327,0 2.54,1.693327 5.503336,2.751663 8.466672,2.751663 h 4.233328 M 11.175985,34.762575 c 1.143,-0.33864 2.307168,-0.867832 3.407831,-1.587504 l 2.413,-1.629832 2.391832,1.693336 c 1.778,1.248832 3.894672,1.968496 6.011336,1.968496 2.116664,0 4.233336,-0.71968 6.011336,-1.968496 l 2.391831,-1.693336 2.413,1.629832 c 1.735664,1.164168 3.640664,1.820336 5.418664,1.968504 C 38.607983,21.237071 26.183152,9.8070725 12.699985,9.8070725 c -0.7408,0 -1.418168,0.3810395 -1.799168,0.9948315 -0.38104,0.63504 -0.42336,1.418168 -0.08464,2.074336 4.593167,9.186335 3.174999,16.594671 0.35984,21.886335 m 22.690662,10.392831 c -5.079999,3.598336 -11.853327,3.598336 -16.933327,0 -2.54,1.693336 -5.503335,2.751664 -8.4666707,2.751664 h -4.233328 v 4.233336 h 4.233328 c 2.9633357,0 5.9266707,-0.846664 8.4666707,-2.116664 5.291664,2.751664 11.641664,2.751664 16.933327,0 2.54,1.27 5.503336,2.116664 8.466672,2.116664 h 4.233328 V 47.90707 h -4.233328 c -2.963336,0 -5.926672,-1.058328 -8.466672,-2.751664 z"
id="path1-5"
style="stroke-width:2.11666;fill:#e3f2fd"
clip-path="url(#clipPath1)" /></g></svg>
defaultAvatars/sheep.svg
@@ -1,48 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="sheep.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="1.192474"
inkscape:cx="-23.480597"
inkscape:cy="156.81684"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 42.333322,17.991695 a 5.2916644,5.2916644 0 0 1 -5.291664,5.291662 c -2.285999,0 -4.233331,-1.460496 -4.952998,-3.471327 -0.931333,0.825496 -2.158999,1.354664 -3.513665,1.354664 -1.185332,0 -2.285999,-0.40216 -3.174999,-1.058336 -0.888999,0.65616 -1.968499,1.058336 -3.174998,1.058336 -1.354666,0 -2.582332,-0.5292 -3.513665,-1.354664 -0.719664,2.010831 -2.666999,3.471327 -4.952998,3.471327 A 5.2916644,5.2916644 0 0 1 8.4666704,17.991695 c 0,-2.624663 1.9261656,-4.80483 4.4449976,-5.206998 -0.127,-0.35984 -0.211664,-0.740799 -0.211664,-1.142999 a 3.1749986,3.1749986 0 0 1 3.174999,-3.1749986 c 0.423336,0 0.825499,0.08464 1.185333,0.2328 0.359832,-1.354663 1.587499,-2.349503 3.047999,-2.349503 0.529167,0 1.058333,0.14816 1.439332,0.35984 0.677336,-1.4181671 2.137832,-2.476503 3.852332,-2.476503 1.714499,0 3.174998,1.0583359 3.852332,2.476503 0.380999,-0.21168 0.910166,-0.35984 1.439332,-0.35984 1.4605,0 2.688166,0.9948319 3.047999,2.349495 0.359832,-0.14816 0.762,-0.2328 1.185332,-0.2328 a 3.1749986,3.1749986 0 0 1 3.174999,3.1749986 c 0,0.40216 -0.08466,0.783199 -0.211664,1.142999 2.518833,0.40216 4.444998,2.582335 4.444998,5.206998 M 21.166668,25.40002 a 2.1166658,2.1166658 0 0 0 -2.116667,2.116663 2.1166658,2.1166658 0 0 0 2.116667,2.116663 2.1166658,2.1166658 0 0 0 2.116665,-2.116663 2.1166658,2.1166658 0 0 0 -2.116665,-2.116663 m 8.466662,0 a 2.1166658,2.1166658 0 0 0 -2.116665,2.116663 2.1166658,2.1166658 0 0 0 2.116665,2.116663 2.1166658,2.1166658 0 0 0 2.116666,-2.116663 2.1166658,2.1166658 0 0 0 -2.116666,-2.116663 m 13.186828,-2.836335 c -1.354666,1.714503 -3.428998,2.836335 -5.778497,2.836335 -0.9525,0 -1.862667,-0.21168 -2.730499,-0.57152 -0.0212,5.397502 -0.804333,11.916827 -3.725332,15.28233 -1.100666,1.248831 -2.434165,1.926167 -4.127498,2.137831 v -4.148663 h -2.116666 v 4.148663 c -1.693333,-0.21168 -3.026832,-0.867832 -4.127498,-2.137831 -2.942166,-3.386663 -3.725332,-9.86366 -3.746498,-15.261162 -0.846667,0.33864 -1.756833,0.55032 -2.709333,0.55032 -2.349499,0 -4.423831,-1.121832 -5.7784968,-2.836335 -1.8838328,1.883831 -3.7464984,2.836335 -3.7464984,2.836335 0,0 2.1166655,4.233326 6.3499972,4.233326 0.761999,0 1.354665,-0.08464 1.862665,-0.19048 0.719664,8.085669 3.598332,17.123833 12.953995,17.123833 9.355663,0 12.234328,-9.038164 12.953994,-17.123833 0.508,0.10584 1.100667,0.19048 1.862666,0.19048 4.233332,0 6.349998,-4.233326 6.349998,-4.233326 0,0 -1.862666,-0.952504 -3.746499,-2.836335 z"
id="path1-2"
style="stroke-width:2.11666;fill:#efebe9" /></g></svg>
defaultAvatars/snail.svg
@@ -1,77 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="snail.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 41.326269,23.346833 1.968503,-6.519332 c 0.910159,-0.211679 1.608663,-1.015999 1.608663,-2.01083 0,-1.164168 -0.952503,-2.116671 -2.116663,-2.116671 -1.164167,0 -2.11667,0.952503 -2.11667,2.116671 0,0.550319 0.2328,1.058327 0.571519,1.439327 l -1.629831,5.460996 -1.629839,-5.460996 c 0.33864,-0.38104 0.57152,-0.889 0.57152,-1.439327 0,-1.164168 -0.952495,-2.116671 -2.116663,-2.116671 -1.164167,0 -2.116662,0.952503 -2.116662,2.116671 0,0.994831 0.698479,1.799167 1.608663,2.01083 l 1.968494,6.519332 c -2.031998,0.31752 -3.577165,2.053159 -3.577165,4.16983 v 4.762493 C 31.462643,25.738664 25.070311,21.166667 17.619652,21.166667 c -8.2973308,0 -15.0494937,6.900323 -15.0494937,15.36699 0,3.894662 1.7356649,7.387164 4.4449969,9.71549 l -2.582332,0.31752 c -1.058333,0.12704 -1.8626649,1.058335 -1.8626649,2.116671 0,1.164159 0.9524999,2.116662 2.1166649,2.116662 H 38.807471 c 2.201334,0 3.979333,-1.777999 3.979333,-3.979333 V 31.157341 c 1.27,-0.71968 2.116663,-2.074335 2.116663,-3.640662 0,-2.116671 -1.545167,-3.852334 -3.577166,-4.16983 m -9.969498,19.854316 -7.471827,0.952503 c 0.910168,-1.608671 1.545167,-3.492501 1.545167,-5.503332 0,-4.910661 -3.915829,-8.889995 -8.741826,-8.889995 -1.121832,0 -2.222503,0.254 -3.238502,0.7408 -1.03716,0.5292 -1.481664,1.799167 -0.952496,2.836334 0.508,1.058328 1.777999,1.481663 2.836334,0.973664 0.42336,-0.21168 0.889,-0.31752 1.354664,-0.31752 2.497662,0 4.508493,2.074335 4.508493,4.656661 0,3.51367 -2.751663,6.371164 -6.159492,6.371164 -4.529662,0 -8.2338268,-3.809998 -8.2338268,-8.487827 0,-6.138332 4.8471648,-11.133657 10.8161608,-11.133657 7.746995,0 14.054655,6.476996 14.054655,14.435655 0,1.142999 -0.12704,2.264831 -0.31752,3.365494 z"
id="path1-9"
style="stroke-width:2.11666;fill:#efebe9"
clip-path="url(#clipPath10)" /></g></svg>
defaultAvatars/snake.svg
@@ -1,63 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="snake.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 41.274986,40.216664 h -3.175007 c 2.328335,0 4.233335,-1.905 4.233335,-4.233327 0,-2.328336 -1.905,-4.233336 -4.233335,-4.233336 v -8.466664 c 0,-2.116672 0,-4.233336 -2.286,-6.053671 0.10584,-0.44448 0.16936,-0.889 0.16936,-1.354664 0,-4.085168 -4.233328,-7.4083358 -9.525,-7.4083358 -4.783664,0 -8.720663,2.7728318 -9.376831,6.3499998 h -4.381504 l -4.84716,-4.677832 -1.502837,1.502832 4.233333,4.233336 -4.233333,4.233335 1.502837,1.502832 4.84716,-4.677831 h 4.381504 c 0.65616,3.577167 4.593167,6.349999 9.376831,6.349999 1.058336,0 2.116664,-0.16936 3.026832,-0.42336 0.08464,0.14816 0.14816,0.29632 0.14816,0.42336 v 8.466664 H 16.933332 c -2.328336,0 -4.233336,1.905 -4.233336,4.233336 0,2.328327 1.905,4.233327 4.233336,4.233327 h -3.175 c -2.921,0 -5.291664,2.370672 -5.291664,5.291672 0,0.35984 0,0.71968 0.10584,1.058328 h -0.10584 c -2.328335,0 -4.2333349,1.905 -4.2333349,4.233336 H 41.275002 c 2.921,0 5.291664,-2.370664 5.291664,-5.291664 0,-2.921 -2.370664,-5.291672 -5.291664,-5.291672 M 25.399995,14.816666 c -1.16416,0 -2.116664,-0.952496 -2.116664,-2.116664 0,-1.164168 0.952504,-2.116664 2.116664,-2.116664 1.164168,0 2.116672,0.952496 2.116672,2.116664 0,1.164168 -0.952504,2.116664 -2.116672,2.116664 z"
id="path1-6"
style="stroke-width:2.11666;fill:#e0f7fa"
clip-path="url(#clipPath6)" /></g></svg>
defaultAvatars/spider.svg
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="spider.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="1.192474"
inkscape:cx="-23.480597"
inkscape:cy="3.354371"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 27.516665,0 v 10.752665 a 11.578168,11.578168 0 0 0 -2.116668,-0.16936 11.578168,11.578168 0 0 0 -2.116666,0.16936 V 0 m 12.488335,27.516668 a 10.583335,10.583335 0 0 1 -0.359832,1.164168 l 6.921501,3.958168 v 9.69433 h -4.233336 v -7.239001 l -4.783667,-2.730497 a 10.456335,10.456335 0 0 1 -15.832669,0 l -4.783667,2.730497 v 7.239001 H 8.4666619 v -9.69433 L 15.388163,28.680836 A 10.583335,10.583335 0 0 1 15.02833,27.516668 H 11.218329 L 5.3974951,31.390172 3.0691612,27.8765 9.9483293,23.283331 H 15.02833 a 10.583335,10.583335 0 0 1 0.571499,-1.862664 l -3.302,-2.116664 -7.5565012,1.862664 -1.0160001,-4.233337 9.3768343,-2.286 4.889501,3.238504 a 10.583335,10.583335 0 0 1 14.816669,0 l 4.804834,-3.238504 9.461502,2.286 -1.016,4.233337 -7.556501,-1.883832 -3.302001,2.116664 a 10.583335,10.583335 0 0 1 0.571504,1.883832 h 5.080001 l 6.879167,4.572001 -2.328337,3.513672 -5.820834,-3.852336 M 23.283331,25.400003 a 2.116667,2.116667 0 1 0 -2.116667,2.116665 2.116667,2.116667 0 0 0 2.116667,-2.116665 m 8.466667,0 a 2.116667,2.116667 0 1 0 -2.116666,2.116665 2.116667,2.116667 0 0 0 2.116666,-2.116665 z"
id="path1-5"
style="stroke-width:2.11666;fill:#eceff1"
clip-path="url(#clipPath1)" /></g></svg>
defaultAvatars/tortoise.svg
@@ -1,92 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="tortoise.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="5.2352457"
inkscape:cx="76.596215"
inkscape:cy="103.52905"
inkscape:current-layer="layer1"
showguides="false" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5"><circle
style="fill:#4caf50;stroke-width:3.175;stroke-miterlimit:8"
id="circle6"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#4caf50;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 44.183515,21.452088 c -2.582292,-0.08464 -5.143416,1.904967 -5.947738,5.079912 -1.05831,4.233264 -1.05831,4.233264 -3.174946,6.349892 -4.233256,4.233264 -10.583148,6.349892 -23.282931,8.46652 -2.1166362,0.338634 -3.1749459,1.058318 -4.2332639,2.116636 4.2332639,0 8.4665199,0 5.2915739,3.174946 L 9.6612638,49.81494 h 6.3498922 l 4.233263,-4.233264 c 4.233264,2.116628 7.048384,2.116628 11.28164,0 l 1.418144,4.233264 h 6.349892 l -2.116628,-6.349892 c 0,0 2.116628,-8.466527 4.233256,-10.583156 2.116636,-2.116628 2.116636,0 4.233263,0 2.116636,0 4.233264,-2.116628 4.233264,-5.291574 0,-1.058318 0,-3.174945 -3.174946,-5.291581 -0.740787,-0.507992 -1.608636,-0.804315 -2.518789,-0.84665 m -21.822468,0.84665 A 12.699783,12.699783 0 0 0 9.6612638,34.99852 c 0,1.269978 0.275195,2.285961 0.4868722,3.386614 12.53045,-2.0743 19.176673,-4.254431 22.647941,-7.746868 l 1.058318,-1.058317 C 31.758927,25.135024 27.271676,22.298737 22.361087,22.298737 Z"
id="path1-7"
style="fill:#e8f5e9;stroke-width:2.11663"
clip-path="url(#clipPath5)" /></g></svg>
defaultAvatars/turkey.svg
@@ -1,70 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="turkey.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 17.991664,45.381335 c -1.587496,0.762 -3.386663,1.185328 -5.291663,1.185328 C 5.6938328,46.566663 1.6185303e-6,40.872831 1.6185303e-6,33.866664 V 23.283336 C 1.6185303e-6,16.277169 5.6938328,10.583337 12.700001,10.583337 l 5.291663,9.694327 c -5.079999,2.603504 -8.4666632,7.239 -8.4666632,12.530672 0,5.291663 3.4078322,9.948327 8.4666632,12.572999 m 11.641672,-1.058336 v 2.243664 H 31.75 c 1.164168,0 2.116664,0.952504 2.116664,2.116672 0,1.164168 -0.952496,2.116664 -2.116664,2.116664 H 25.4 c -1.164168,0 -2.116664,-0.952496 -2.116664,-2.116664 0,-1.164168 0.952496,-2.116672 2.116664,-2.116672 V 44.322999 C 18.224504,43.518663 12.700001,38.671503 12.700001,32.808336 c 0,-6.434672 6.625167,-11.641672 14.816663,-11.641672 0.40216,0 0.7832,0 1.185336,0 -1.524,-2.899832 -3.302,-5.863167 -3.302,-8.466663 0,-2.328336 1.905,-4.2333362 4.233336,-4.2333362 4.677831,0 8.466663,3.7888322 8.466663,8.4666722 h -4.233335 c 0,0 8.466671,6.349999 8.466671,15.874999 0,5.863167 -5.524504,10.710327 -12.699999,11.514663 m 0,-31.622998 c 0,1.164168 0.952496,2.116664 2.116664,2.116664 1.164168,0 2.116664,-0.952496 2.116664,-2.116664 0,-1.164168 -0.952496,-2.116664 -2.116664,-2.116664 -1.164168,0 -2.116664,0.952496 -2.116664,2.116664 M 31.75,29.633336 C 31.75,27.305 29.866168,25.4 27.516664,25.4 22.838832,25.4 19.05,29.188832 19.05,33.866664 h 8.466664 c 2.349504,0 4.233336,-1.883832 4.233336,-4.233328 z"
id="path1-6"
style="stroke-width:2.11666;fill:#fbe9e7"
clip-path="url(#clipPath8)" /></g></svg>
defaultAvatars/unicorn.svg
@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="unicorn.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.5738353"
inkscape:cx="123.1625"
inkscape:cy="130.15596"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#673ab7;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#673ab7;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 43.359999,7.439591 -3.76767,5.672674 c 2.286,1.524 3.76767,4.106338 3.76767,7.02733 v 14.816678 l -6.35,2.116672 -6.519334,-10.414004 c -0.5504,-0.88896 -1.947328,-0.508 -1.947328,0.55024 v 15.15535 c 0,4.148656 -1.65101,7.874002 -4.233346,10.710338 V 79.40621 H 13.726659 V 58.239527 c -0.33872,0 -0.67728,0 -1.0584,0 -0.88896,0 -1.778,-0.1264 -2.624672,-0.25392 l -19.811992,-3.302 -3.725344,8.297346 4.106338,16.425337 h -10.922004 l -3.894674,-15.663337 c -0.29632,-1.14304 -0.16928,-2.370672 0.29632,-3.386672 l 3.767666,-8.466676 c -3.72533,-2.455328 -6.222994,-6.604002 -6.350002,-11.387668 -0.16928,0.635042 -0.25408,1.566402 -0.1264,2.92101 0.1264,1.862656 0.59264,4.614322 0.29632,7.662322 -0.16928,3.048002 -1.524,6.180674 -3.302002,8.25501 -1.862672,2.074338 -3.852336,3.513666 -5.96901,4.614338 l -2.963328,-2.963344 c 0.80432,-1.989666 1.608672,-3.767666 1.778,-5.418658 0.25408,-1.5664 -0.0416,-2.836338 -0.508,-3.979346 l -2.243664,-4.783666 c -0.88896,-2.158992 -1.989666,-5.291664 -1.778002,-8.974658 0.1264,-3.598338 2.116658,-8.297346 5.884338,-10.879684 3.810002,-2.58232 7.916324,-2.963328 11.26066,-2.243664 2.116674,0.42336 4.275666,1.43936 6.138338,2.878672 1.5664,-0.71968 3.386674,-1.10064 5.291666,-1.10064 h 24.341672 v -2.116656 c 0,-9.355684 7.577682,-16.93335 16.93335,-16.93335 L 43.360489,-5.260381 39.127159,7.439623 Z"
id="path1-2"
style="stroke-width:4.23332;fill:#ede7f6"
clip-path="url(#clipPath1)" /></g></svg>
default_avatars/bat.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="bat.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.4785557"
inkscape:cx="41.109015"
inkscape:cy="107.80336"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 1.5874982,16.561181 c 0,0 8.9958338,-2.116664 15.3458338,2.116673 0,0 1.058334,7.937496 5.291667,7.937496 v -3.704168 c 0,0 1.058334,2.116672 3.175001,2.116672 2.116667,0 3.175,-2.116672 3.175,-2.116672 v 3.704168 c 4.233334,0 5.291668,-7.937496 5.291668,-7.937496 6.35,-4.233337 15.345834,-2.116673 15.345834,-2.116673 -4.233334,2.116673 -4.7625,9.525001 -4.7625,9.525001 -8.466668,0 -8.466668,6.879169 -8.466668,6.879169 C 25.4,30.848687 25.4,38.786183 25.4,38.786183 c 0,0 0,-7.937496 -10.583334,-5.820832 0,0 0,-6.879169 -8.4666673,-6.879169 0,0 -0.5291664,-7.408328 -4.7625005,-9.525001 z"
id="path1-5"
style="fill:#eceff1;stroke-width:2.11666" /></g></svg>
default_avatars/bee.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="bee.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ffc107;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="M 36.777121,18.944178 C 35.930456,16.404174 34.237117,14.710843 31.697113,13.652505 V 10.4775 h -2.116667 v 2.963341 h -0.846674 c -2.328331,0 -4.233335,0.846665 -5.926673,2.540004 l -0.846666,0.846665 -2.96334,-1.058337 c -0.635041,-0.211681 -1.270003,-0.423361 -2.116668,-0.423361 -1.270002,0 -2.540004,0.423361 -3.598342,1.270002 -1.270002,0.846665 -1.905003,1.905003 -2.328339,2.963333 -0.423361,1.481674 -0.423361,2.751676 0,4.233343 0.634961,1.481666 1.270002,2.540004 2.328339,3.175005 -0.846665,3.175005 -0.21168,5.926673 2.116668,8.255013 1.693338,1.693339 3.598342,2.540004 5.926681,2.540004 1.05833,0 1.693331,0 2.328332,-0.21168 1.270002,1.693339 2.963341,2.751668 5.080008,2.751668 0.634961,0 1.481675,0 2.116676,-0.21168 1.270002,-0.423361 2.116667,-1.270002 2.963333,-2.328332 0.846673,-1.270002 1.270002,-2.32834 1.270002,-3.598342 0,-0.846665 0,-1.481666 -0.211681,-2.116667 l -1.058337,-3.386678 1.270002,-0.846673 c 1.693338,-1.693331 2.540004,-4.02167 2.328339,-6.561675 h 2.751669 v -2.328339 h -3.38667 m -20.531697,4.868344 c -1.270002,-0.634961 -1.693339,-1.481667 -1.270002,-2.751669 0.423361,-1.270002 1.270002,-1.693339 2.540004,-1.270002 l 6.773339,2.540004 c -3.386669,1.693331 -5.926673,2.116668 -8.043341,1.481667 M 29.58043,35.665813 c -1.270002,0.42336 -2.116676,0 -2.751677,-1.270002 -0.635041,-2.116676 -0.21168,-4.65668 1.481675,-8.043349 l 2.540004,6.561674 c 0.42336,1.481675 0,2.32834 -1.270002,2.751677 m 2.540004,-11.218354 -1.270002,-3.38667 v -0.21168 L 30.215391,20.214068 H 30.00371 l -3.386669,-1.270002 c 0.846665,-0.634961 1.693339,-1.05833 2.751668,-1.05833 1.058338,0 2.116676,0.423361 2.963341,1.270002 0.846665,0.846665 1.270002,1.693331 1.270002,2.751668 -0.423361,0.634962 -0.846665,1.693339 -1.481666,2.540005 z"
id="path1-9"
style="stroke-width:2.11667;fill:#ff6f00" /></g></svg>
default_avatars/bird.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="bird.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.0855027"
inkscape:cx="153.44022"
inkscape:cy="128.98569"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#9c27b0;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 50.712198,23.289884 -6.455906,-2.391859 c -0.550326,-2.434195 -1.92619,-3.831211 -1.92619,-3.831211 -3.471367,-3.471376 -9.080599,-3.471376 -12.551974,0 l -3.1327,3.132699 L 12.611765,5.2980162 c -2.116688,8.4667598 0,16.9335198 5.185899,23.7492698 L 6.2616977,40.223413 c 0,0 18.8173763,4.233376 29.7818373,-4.339218 5.842066,-4.572051 7.154417,-7.239082 7.979923,-10.054282 l 6.68874,-2.540029 M 39.51491,23.75557 c -0.825513,0.825505 -2.180192,0.825505 -3.005706,0 -0.825505,-0.825514 -0.825505,-2.159025 0,-2.984538 0.825514,-0.825506 2.180193,-0.825506 3.005706,0 0.825506,0.825513 0.825506,2.159024 0,2.984538 z"
id="path1-3"
style="fill:#f3e5f5;stroke-width:2.11669" /></g></svg>
default_avatars/bug.svg
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="bug.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.7889873"
inkscape:cx="117.97347"
inkscape:cy="97.651422"
inkscape:current-layer="layer1"
showguides="false" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#f44336;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 29.633336,25.4 h -8.466664 v -4.233336 h 8.466664 m 0,12.7 h -8.466664 v -4.233328 h 8.466664 m 12.7,-12.7 h -5.947832 c -0.952496,-1.651 -2.264832,-3.069168 -3.852336,-4.148672 L 35.983336,9.3344956 32.99884,6.3499996 28.405672,10.943168 c -0.973664,-0.2328 -1.947336,-0.35984 -3.005664,-0.35984 -1.058336,0 -2.032,0.12696 -2.984504,0.35984 l -4.614336,-4.5931684 -2.984496,2.984496 3.429,3.4501684 c -1.566336,1.079504 -2.878664,2.497672 -3.831168,4.148672 H 8.4666716 v 4.233328 h 4.4238324 c -0.10584,0.69848 -0.19048,1.397 -0.19048,2.116672 V 25.4 H 8.4666876 v 4.233336 H 12.700024 V 31.75 c 0,0.71968 0.08464,1.418168 0.19048,2.116664 H 8.4666636 V 38.1 H 14.414496 C 16.615832,41.888832 20.701,44.45 25.4,44.45 c 4.699,0 8.78416,-2.561168 10.985496,-6.35 h 5.947832 v -4.233336 h -4.423832 c 0.10584,-0.69848 0.19048,-1.397 0.19048,-2.116664 v -2.116664 h 4.233328 V 25.4 h -4.233328 v -2.116664 c 0,-0.71968 -0.08464,-1.418168 -0.19048,-2.116672 h 4.423832 z"
id="path1-2"
style="stroke-width:2.11666;fill:#ffebee" /></g></svg>
default_avatars/butterfly.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="butterfly.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="80.675909"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#4caf50;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 27.516823,44.449976 h -4.233326 v -31.74998 l -4.169829,-4.2968374 2.053159,-2.053159 4.233333,4.2333254 4.233333,-4.2333254 2.116663,2.116663 -4.233333,4.2333334 v 31.74998 M 14.81683,12.699996 c -5.8419964,0 -10.5833214,4.741325 -10.5833214,10.583322 0,3.471333 1.672167,6.540499 4.233325,8.466666 v 0 4.233326 c 0,4.677837 3.7888384,8.466666 8.4666674,8.466666 1.523999,0 2.942166,-0.402159 4.16983,-1.058335 l 0.0632,-0.08464 V 14.816683 C 19.388508,13.48318 17.208349,12.70002 14.81651,12.70002 m -1.058327,13.75832 -3.174998,-3.174999 3.174998,-3.174998 3.174998,3.174998 -3.174998,3.174999 m 32.808308,-3.174999 c 0,-5.841996 -4.741325,-10.583321 -10.583322,-10.583321 -2.37067,0 -4.550829,0.7832 -6.349996,2.116663 v 0 28.490318 c 1.248831,0.7408 2.688167,1.142999 4.233326,1.142999 4.677837,0 8.466666,-3.788829 8.466666,-8.466666 v -4.233326 0 c 2.561167,-1.926167 4.233326,-4.995333 4.233326,-8.466667 m -9.524994,3.174999 -3.174998,-3.174999 3.174998,-3.174998 3.174998,3.174998 z"
id="path1-5"
style="stroke-width:2.11666;fill:#e8f5e9" /></g></svg>
default_avatars/cat.svg
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="cat.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="1.846029"
inkscape:cx="2.7085165"
inkscape:cy="200.97192"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ff9800;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
fill="currentColor"
d="m 25.400001,16.40418 -2.815164,0.19048 C 20.764505,14.435662 15.663343,8.9958335 10.583346,8.9958335 c 0,0 -4.1698298,6.2653315 -0.08466,14.6261555 -1.1641649,1.756832 -1.8838307,2.666999 -2.0319978,4.762492 l -4.0851663,0.61384 0.4444956,2.074334 3.7253306,-0.550319 0.2963358,1.502838 -3.3231637,1.989663 0.9948328,1.88383 3.0691639,-1.88383 C 12.022678,39.179496 18.182173,41.804166 25.4,41.804166 c 7.217828,0 13.377323,-2.62467 15.811487,-7.789329 l 3.069164,1.88383 0.994833,-1.88383 -3.323164,-1.989663 0.296336,-1.502838 3.72533,0.550319 0.444496,-2.074334 -4.085163,-0.61384 c -0.148168,-2.095493 -0.867833,-3.00566 -2.031998,-4.762492 4.085163,-8.360824 -0.08466,-14.6261555 -0.08466,-14.6261555 -5.079996,0 -10.181158,5.4398285 -12.001491,7.5988265 l -2.815163,-0.19048 m -6.349995,6.349995 a 2.1166649,2.1166649 0 0 1 2.116664,2.116662 2.1166649,2.1166649 0 0 1 -2.116664,2.116662 2.1166649,2.1166649 0 0 1 -2.116665,-2.116662 2.1166649,2.1166649 0 0 1 2.116665,-2.116662 m 12.699989,0 a 2.1166649,2.1166649 0 0 1 2.116663,2.116662 2.1166649,2.1166649 0 0 1 -2.116664,2.116662 2.1166649,2.1166649 0 0 1 -2.116665,-2.116662 2.1166649,2.1166649 0 0 1 2.116665,-2.116662 m -8.46666,6.349995 h 4.23333 l -1.481665,2.942157 c 0.423333,1.354671 1.608665,2.349502 3.069163,2.349502 a 3.1749974,3.1749974 0 0 0 3.174998,-3.174997 h 1.058332 a 4.2333299,4.2333299 0 0 1 -4.23333,4.233332 c -1.587498,0 -2.96333,-0.867839 -3.704163,-2.11667 -0.740833,1.248831 -2.116665,2.11667 -3.704163,2.11667 a 4.2333299,4.2333299 0 0 1 -4.233331,-4.233332 h 1.058333 a 3.1749974,3.1749974 0 0 0 3.174998,3.174997 c 1.460498,0 2.64583,-0.994831 3.069164,-2.349502 z"
id="path1-5"
style="stroke-width:2.11666;fill:#fff3e0" /></g></svg>
default_avatars/cow.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="cow.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.8211031"
inkscape:cx="95.352773"
inkscape:cy="104.9235"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#8bc34a;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 22.224988,37.041662 a 1.0583332,1.0583332 0 0 1 1.058328,1.058336 1.0583332,1.0583332 0 0 1 -1.058328,1.058336 1.0583332,1.0583332 0 0 1 -1.058336,-1.058336 1.0583332,1.0583332 0 0 1 1.058336,-1.058336 m 6.349999,0 a 1.0583332,1.0583332 0 0 1 1.058328,1.058336 1.0583332,1.0583332 0 0 1 -1.058328,1.058336 1.0583332,1.0583332 0 0 1 -1.058336,-1.058336 1.0583332,1.0583332 0 0 1 1.058336,-1.058336 M 21.166652,22.225 a 2.1166665,2.1166665 0 0 1 2.116664,2.116664 2.1166665,2.1166665 0 0 1 -2.116664,2.116671 2.1166665,2.1166665 0 0 1 -2.116664,-2.116671 2.1166665,2.1166665 0 0 1 2.116664,-2.116664 m 8.466663,0 a 2.1166665,2.1166665 0 0 1 2.116672,2.116664 2.1166665,2.1166665 0 0 1 -2.116672,2.116671 2.1166665,2.1166665 0 0 1 -2.116664,-2.116671 2.1166665,2.1166665 0 0 1 2.116664,-2.116664 m 8.466671,14.816662 c 0,4.677832 -5.693831,8.466671 -12.699998,8.466671 -7.006168,0 -12.699999,-3.788839 -12.699999,-8.466671 0,-1.905 0.952496,-3.661831 2.54,-5.079999 -1.587504,-2.116664 -2.54,-4.762496 -2.54,-7.619999 l 0.254,-2.582328 c -1.143,0.31752 -2.51884,0.31752 -3.6406714,0 -2.159,-0.59264 -5.418664,-3.02684 -4.931832,-4.720167 0.4868,-1.693336 4.529664,-2.010832 6.6886634,-1.375832 1.24884,0.35984 2.582336,1.27 3.365504,2.243663 l 1.206504,-1.714503 c -1.27,-2.328328 -0.825504,-8.7841669 5.524495,-10.9008309 l -0.19048,0.29632 v 0 c -0.59264,0.931336 -2.116664,3.873495 -0.508,7.0484949 1.524,-0.63496 3.175,-0.994832 4.931832,-0.994832 1.756831,0 3.407831,0.35984 4.931831,0.994832 1.608664,-3.1749999 0.08464,-6.1171589 -0.508,-7.0484949 l -0.19048,-0.29632 c 6.349999,2.116664 6.794503,8.5725029 5.524503,10.9008309 L 36.364354,17.907 c 0.7832,-0.973663 2.116672,-1.883831 3.365504,-2.243663 2.159,-0.63496 6.201831,-0.31752 6.688663,1.375832 0.4868,1.693327 -2.772832,4.127495 -4.931831,4.720167 -1.121832,0.31752 -2.497664,0.31752 -3.640664,0 l 0.254,2.582328 c 0,2.857503 -0.952504,5.503335 -2.54,7.619999 1.587496,1.418168 2.54,3.174999 2.54,5.079999 M 25.400028,32.808335 c -4.677832,0 -8.466671,1.904999 -8.466671,4.233327 0,2.328336 3.788839,4.233336 8.466671,4.233336 4.677831,0 8.466663,-1.905 8.466663,-4.233336 0,-2.328328 -3.788832,-4.233327 -8.466663,-4.233327 m 0,-4.233336 c 2.370663,0 4.593167,0.44448 6.498167,1.185336 1.227664,-1.460504 1.968496,-3.302 1.968496,-5.418671 a 8.4666654,8.4666654 0 0 0 -8.466663,-8.466663 8.4666654,8.4666654 0 0 0 -8.466671,8.466663 c 0,2.116671 0.7408,3.958167 1.968503,5.418671 1.905,-0.7408 4.127496,-1.185336 6.498168,-1.185336 M 29.823859,5.5880021 Z"
id="path1-2"
style="stroke-width:2.11666;fill:#f1f8e9" /></g></svg>
default_avatars/dog.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="dog.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.8092114"
inkscape:cx="11.391097"
inkscape:cy="191.51282"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 38.100001,8.4666661 c -3.6195,0 -5.820833,0.69848 -7.090833,1.291168 -1.629834,-0.804336 -3.4925,-1.291168 -5.609168,-1.291168 -2.116666,0 -3.979333,0.4868 -5.609167,1.291168 -1.27,-0.59264 -3.471334,-1.291168 -7.090834,-1.291168 -6.3500006,0 -10.5833343,16.9333289 -10.5833343,21.1666659 0,1.756832 2.7940002,3.365504 6.6463338,4.021664 1.3546665,4.741337 7.7470005,8.360837 15.5786685,8.678337 v -9.059337 c -1.248833,-0.78312 -3.175,-2.201328 -3.175,-3.640664 0,-2.116664 4.233333,-2.116664 4.233333,-2.116664 0,0 4.233334,0 4.233334,2.116664 0,1.439336 -1.926166,2.857504 -3.175,3.640664 v 9.059337 c 7.831667,-0.31752 14.224001,-3.937 15.578668,-8.678337 3.852334,-0.65616 6.646334,-2.264832 6.646334,-4.021664 0,-4.233337 -4.233333,-21.1666659 -10.583335,-21.1666659 M 8.7841649,29.358164 c -1.058333,-0.254 -1.8838331,-0.55032 -2.4341665,-0.7832 0.5291664,-5.863161 4.6566666,-15.02833 6.4558346,-15.875002 1.143,0 2.010833,0.12696 2.794,0.2328 C 11.154832,17.822267 9.3979985,25.484604 8.7841649,29.3581 M 19.05,25.399995 a 2.1166669,2.1166669 0 0 1 -2.116667,-2.116664 c 0,-1.143 0.9525,-2.116664 2.116667,-2.116664 a 2.1166669,2.1166669 0 0 1 2.116667,2.116664 c 0,1.185336 -0.9525,2.116664 -2.116667,2.116664 m 12.700001,0 a 2.1166669,2.1166669 0 0 1 -2.116667,-2.116664 c 0,-1.143 0.9525,-2.116664 2.116667,-2.116664 a 2.1166669,2.1166669 0 0 1 2.116667,2.116664 c 0,1.185336 -0.9525,2.116664 -2.116667,2.116664 m 10.265834,3.958169 c -0.613832,-3.873496 -2.370666,-11.535833 -6.815667,-16.42533 0.783168,-0.10584 1.651,-0.23288 2.794,-0.23288 1.799167,0.846672 5.926667,10.011841 6.455835,15.875002 -0.529168,0.23288 -1.354668,0.5292 -2.434168,0.7832 z"
id="path1-7"
style="stroke-width:2.11666;fill:#efebe9" /></g></svg>
default_avatars/dolphin.svg
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="dolphin.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12"><circle
style="fill:#03a9f4;stroke-width:3.175;stroke-miterlimit:8"
id="circle13"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#03a9f4;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 40.217144,19.049629 c 0,0 0,-8.466772 -10.583462,-8.466772 -3.238534,0 -6.032568,0.402164 -8.466765,1.058348 -1.058348,-0.931347 -7.91643,-6.7543678 -14.8168398,0.148162 l 5.4187278,5.418728 c -8.5937668,9.313447 -5.4187278,25.125132 -5.4187278,25.125132 0,0 -6.3500772,0 -6.3500772,8.466772 0,0 8.4667662,-2.116697 8.4667662,-2.116697 0,0 8.4667648,2.116697 8.4667648,2.116697 0,-8.466772 -6.350076,-8.466772 -6.350076,-8.466772 0,0 1.79919,-12.192146 14.816849,-14.435836 v 5.969071 c 4.233378,0 5.672731,-3.831214 6.117241,-6.350076 h 4.466213 c 8.466772,0 10.583462,-2.116689 10.583462,-4.233386 0,-2.116689 -4.233379,-4.233379 -6.350076,-4.233379 m -4.233386,2.11669 c -1.164174,0 -2.11669,-0.952516 -2.11669,-2.11669 0,-1.164181 0.952516,-2.116697 2.11669,-2.116697 1.164182,0 2.116697,0.952516 2.116697,2.116697 0,1.164174 -0.952515,2.11669 -2.116697,2.11669 z"
id="path1-3"
style="stroke-width:2.11669;fill:#e1f5fe"
clip-path="url(#clipPath12)" /></g></svg>
default_avatars/donkey.svg
@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="donkey.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.7889873"
inkscape:cx="117.97347"
inkscape:cy="97.651422"
inkscape:current-layer="layer1"
showguides="false" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 45.163941,32.490816 -0.14816,-0.14816 -0.19048,-0.190481 -6.731006,-6.752173 v -2.116666 a 1.0583343,1.0583343 0 0 0 -1.058329,-1.058337 c -0.29632,0 -0.59264,0.12704 -0.7832,0.33864 l -7.768175,7.069678 H 14.810915 c -1.439337,0 -2.772835,0.740801 -3.556004,1.947338 l -5.7150065,5.651501 c -0.6984966,0.952505 -0.4868324,2.264834 0.465664,2.984506 0.7196649,0.508001 1.7145056,0.529201 2.4553386,0 l 2.1166649,-1.968505 v 12.551842 h 6.350007 v -8.466671 h 10.583345 v 8.466671 h 6.350005 V 39.856822 c 0,-1.121833 0.44448,-2.20133 1.248833,-2.984499 l 2.984499,-3.005666 4.233339,2.116666 v 0 c 0.317521,0.16936 0.677361,0.2752 1.058337,0.2752 1.270001,-0.0424 2.30717,-1.100673 2.286002,-2.391834 -0.0216,-0.508001 -0.16936,-0.994841 -0.508,-1.375841 z"
id="path1-5"
style="stroke-width:2.11667;fill:#fafafa"
clip-path="url(#clipPath1)" /></g></svg>
default_avatars/duck.svg
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="duck.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 21.418441,16.933333 a 3.1750002,3.1750002 0 0 0 -3.175,3.175001 3.1750002,3.1750002 0 0 0 3.175,3.175 3.1750002,3.1750002 0 0 0 3.175001,-3.175 3.1750002,3.1750002 0 0 0 -3.175001,-3.175001 m 3.175001,-6.35 A 10.583334,10.583334 0 0 1 35.17677,21.16667 c 0,3.598328 -1.79916,6.773328 -4.529664,8.678328 3.344336,0.31752 7.112001,1.079505 10.879665,2.963337 6.350008,3.175 8.466673,-1.058336 8.466673,-1.058336 0,0 -2.116665,19.050001 -14.816674,19.050001 H 22.476769 c 0,0 -10.583328,0 -10.583328,-10.583329 0,-6.35 6.35,-8.466672 4.233328,-12.700001 -8.4666644,0 -8.4666644,-7.408336 -8.4666644,-7.408336 2.1166669,1.058336 4.7413364,1.058336 6.3500004,0.31752 0.40216,-5.503337 4.995336,-9.842505 10.583337,-9.842505 z"
id="path1-2"
style="fill:#f57f17;stroke-width:2.11666"
clip-path="url(#clipPath2)" /></g></svg>
default_avatars/elephant.svg
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="elephant.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.0988174"
inkscape:cx="80.675938"
inkscape:cy="135.21287"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#cddc39;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#cddc39;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 37.041661,36.923702 a 1.0583333,1.0583333 0 0 1 -1.058336,1.058336 1.0583333,1.0583333 0 0 1 -1.058328,-1.058336 V 22.107039 c 0,-4.085167 -4.381503,-7.408335 -8.466671,-7.408335 H 8.4666629 A 8.4666657,8.4666657 0 0 0 0,23.165375 V 44.332038 H 8.4666629 V 35.865374 H 19.049998 v 8.466664 h 8.466664 v -9.525 a 1.0583333,1.0583333 0 0 1 1.058336,-1.058336 1.0583333,1.0583333 0 0 1 1.058328,1.058336 v 3.175 a 6.3499996,6.3499996 0 0 0 6.349999,6.35 6.3499996,6.3499996 0 0 0 6.35,-6.35 v -4.233336 h -5.291664 z"
id="path1-2"
style="fill:#827717;stroke-width:2.11666"
clip-path="url(#clipPath1)" /></g></svg>
default_avatars/fish.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="fish.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.8928896"
inkscape:cx="38.024265"
inkscape:cy="171.80054"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#3f51b5;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 25.400002,41.275 1.608664,-6.35 c -6.900332,-0.44448 -13.059833,-3.386672 -14.837833,-7.239 -0.190504,1.016 -0.465664,1.947328 -0.889,2.645832 -1.3969995,2.476496 -4.2333334,2.476496 -7.0484998,2.476496 2.3283335,0 3.1750004,-3.323168 3.1750004,-7.408328 0,-4.085168 -0.8466669,-7.408336 -3.1750004,-7.408336 2.8151664,0 5.6515003,0 7.0484998,2.476496 0.423336,0.69848 0.698496,1.62984 0.889,2.64584 1.375833,-3.005672 5.439832,-5.43984 10.392834,-6.561672 L 19.049999,9.5249996 c 4.233335,0 8.466667,0 11.281835,1.4181604 2.391832,1.185336 3.767664,3.386672 4.995336,5.736168 6.180664,1.481672 11.239496,4.826 11.239496,8.720672 0,3.979328 -5.291664,7.408328 -11.641664,8.805328 -1.756832,2.328336 -3.471336,4.487336 -4.931831,5.651504 C 28.215171,41.275 26.81817,41.275 25.400003,41.275 m 10.583335,-19.05 a 2.1166667,2.1166667 0 0 0 -2.116672,2.116664 2.1166667,2.1166667 0 0 0 2.116672,2.116664 2.1166667,2.1166667 0 0 0 2.116664,-2.116664 A 2.1166667,2.1166667 0 0 0 35.983338,22.225 Z"
id="path1-2"
style="fill:#e8eaf6;stroke-width:2.11666" /></g></svg>
default_avatars/horse.svg
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="horse.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2235234"
inkscape:cx="93.686306"
inkscape:cy="103.61333"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#ff9800;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#f44336;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 43.360002,20.139465 v 14.816663 l -6.35,2.116655 -6.519322,-10.413994 c -0.550399,-0.888959 -1.947343,-0.508 -1.947343,0.5504 v 15.155334 c 0,4.148654 -1.650992,7.873995 -4.233326,10.710314 V 83.639489 H 13.726689 V 58.239505 c -0.33872,0 -0.67728,0 -1.0584,0 -0.888959,0 -1.777998,-0.126399 -2.624669,-0.254079 L -8.7523666,54.852757 -13.493692,63.361759 -9.4296946,83.63941 H -20.140024 L -24.37335,63.531086 c -0.1264,-1.269919 0,-2.539997 0.67728,-3.64067 l 4.317997,-7.662315 c -4.148669,-2.328334 -6.984987,-6.688668 -7.111995,-11.726329 -0.16928,0.635041 -0.25392,1.5664 -0.1264,2.920991 0.1264,1.862671 0.592639,4.614334 0.296319,7.662332 -0.169279,3.047998 -1.566399,6.180667 -3.344333,8.255003 -1.820287,2.074319 -3.80995,3.513662 -5.926621,4.614317 l -2.963326,-2.963326 c 0.80432,-1.989663 1.608655,-3.767663 1.777999,-5.41867 0.25408,-1.566398 -0.0416,-2.836317 -0.508,-3.979325 l -2.243678,-4.783661 c -0.88896,-2.159007 -1.989663,-5.291661 -1.777999,-8.974667 0.1264,-3.598334 2.11667,-8.297323 5.884332,-10.879657 3.809998,-2.582334 7.916331,-2.92099 11.260665,-2.243663 2.116671,0.42336 4.275662,1.439359 6.138332,2.878671 1.566399,-0.71968 3.386654,-1.10064 5.291661,-1.10064 H 11.61053 v -2.11667 c 0,-9.355659 7.57766,-16.9333191 16.933319,-16.9333191 h 14.816663 l -3.76766,5.6726691 c 2.286,1.524 3.76766,4.106318 3.76766,7.027325 z"
id="path1-7"
style="stroke-width:4.23333;fill:#ffebee"
clip-path="url(#clipPath1)" /></g></svg>
default_avatars/jellyfish.svg
@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="jellyfish.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.0122333"
inkscape:cx="93.618245"
inkscape:cy="134.78372"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#9c27b0;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#9c27b0;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 41.275115,34.118313 c -1.227673,-0.148161 -2.264849,0.889007 -2.116679,2.11668 0,1.418178 -2.11668,1.418178 -2.11668,0 V 31.36662 l 3.598355,-1.058336 c 1.524011,-0.719685 2.561187,-2.159016 2.751692,-3.810028 0,-11.430086 -8.043396,-18.838478 -17.991807,-18.838478 -9.948403,0 -17.9917989,7.408392 -17.9917989,18.838478 0.127041,1.69334 1.185345,3.175023 2.7516849,3.810028 l 3.598363,1.058336 v 4.868373 a 1.0583413,1.0583413 0 0 1 -1.058344,1.058344 1.0583413,1.0583413 0 0 1 -1.058336,-1.058344 c 0.148161,-1.227673 -0.889007,-2.264849 -2.1166879,-2.11668 -1.227673,-0.148161 -2.264849,0.889007 -2.11668,2.11668 -0.127041,2.984526 2.307185,5.418704 5.2917039,5.291704 2.984526,0.12704 5.418712,-2.307178 5.291711,-5.291704 v -3.810029 h 2.11668 v 12.065091 c 0,1.418178 -2.11668,1.418178 -2.11668,0 0.148162,-1.227673 -0.889006,-2.264849 -2.116687,-2.11668 -1.227674,-0.148161 -2.264849,0.889007 -2.11668,2.11668 -0.254002,3.048023 2.222512,5.651546 5.291703,5.503377 2.984527,0.127041 5.418713,-2.307185 5.291712,-5.291712 V 33.059969 h 2.11668 V 44.70172 c -0.127041,2.984527 2.307185,5.418713 5.291704,5.291712 2.984526,0.127041 5.418713,-2.307185 5.291712,-5.291712 0,-2.815181 -4.233368,-2.815181 -4.233368,0 0,1.418179 -2.11668,1.418179 -2.11668,0 V 32.63663 h 2.11668 v 3.810028 c 0,2.878694 2.39185,5.207039 5.291704,5.080039 2.984526,0.12704 5.418712,-2.307178 5.291711,-5.291704 0.148161,-1.227673 -0.889006,-2.264849 -2.116688,-2.11668 M 22.436646,13.374821 c -3.196192,0.698485 -5.947885,2.688188 -7.620057,5.503377 -0.359843,0.423363 -1.058344,0.571525 -1.481684,0.211682 -0.465683,-0.359843 -0.550324,-1.016008 -0.211681,-1.481683 2.032015,-3.196184 5.228207,-5.461041 8.890067,-6.350048 0.571524,-0.0424 1.079512,0.317522 1.270009,0.846678 0.127041,0.571525 -0.254002,1.164177 -0.84667,1.27001 z"
id="path1-5"
style="stroke-width:2.11668;fill:#f3e5f5"
clip-path="url(#clipPath2)" /></g></svg>
default_avatars/kangaroo.svg
@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="kangaroo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.0122333"
inkscape:cx="93.618247"
inkscape:cy="134.78372"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#9c27b0;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5"><circle
style="fill:#cddc39;stroke-width:3.175;stroke-miterlimit:8"
id="circle6"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#cddc39;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 37.909115,21.60052 -1.693333,2.920994 v 4.381488 l -2.772826,3.323162 -0.804335,3.471329 -2.772827,1.587493 -1.058326,-1.86266 1.989661,-1.12183 0.550319,-2.412996 v 0 l 0.148159,-0.634958 v 0 0 l 1.481661,-1.777997 c 0.38104,-0.444479 0.31752,-1.121838 -0.127039,-1.481669 -0.444479,-0.38096 -1.12183,-0.31752 -1.502829,0.127039 l -1.799165,2.158996 -0.613839,2.624667 c -0.381039,0.0632 -0.761999,0.14816 -1.185334,0.14816 -1.460501,0 -2.793994,-0.507999 -3.746497,-1.269997 -0.169359,2.751666 -1.058326,5.101158 -2.328323,6.413492 l -3.450162,3.725329 -1.142998,7.619985 -4.000496,2.561155 -1.142998,-1.756828 3.196162,-2.074324 0.97367,-6.921491 v -0.0216 l 1.058326,-2.899795 c -1.121758,-0.973342 -1.947252,-2.666675 -2.370587,-4.741007 l -0.35984,0.656159 c -0.761998,1.354669 -1.502829,2.730499 -2.434163,4.127496 -0.952502,1.354661 -1.904997,2.836323 -3.7676572,3.979321 C 7.3021648,43.042271 5.947503,43.296303 4.825665,43.063471 3.64034,42.809472 2.645509,42.068633 2.052839,41.285475 0.88867295,39.676806 0.55000895,38.025809 0.23251395,36.480644 L 2.28567,35.930325 c 0.486879,1.354669 1.121838,2.730499 1.926165,3.471329 0.804334,0.698479 1.460501,0.550319 2.0319958,0 0.677358,-0.571519 1.333501,-1.799156 1.883828,-3.069154 0.571519,-1.291166 1.037166,-2.688163 1.523997,-4.127496 1.0159982,-2.878659 1.9896692,-5.884325 3.7041612,-8.974647 0.888999,-1.523997 1.968501,-3.111498 3.640665,-4.529664 1.650997,-1.418157 3.831153,-2.582323 6.519316,-2.582323 2.688163,0 5.714989,2.582323 7.577658,4.952991 0.888998,1.164166 2.730491,1.015998 3.471321,-0.2752 l 1.947333,-3.344329 c -0.29632,-0.10584 -0.529199,-0.2752 -0.740799,-0.4868 -0.825502,-0.846662 -0.825502,-2.158996 0,-2.96333 l 2.412996,2.391836 c 0.0632,0 0.148159,-0.0424 0.148159,-0.0424 0.867831,0 1.587493,0.507999 1.926165,1.227661 l 2.307155,4.889479 -2.11666,1.058326 z"
id="path1-5"
style="stroke-width:2.11666;fill:#827717"
clip-path="url(#clipPath5)" /></g></svg>
default_avatars/koala.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="koala.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#8bc34a;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 40.216666,10.58334 c -1.905,0 -7.408335,0 -9.948334,6.561664 -0.846664,-0.21168 -1.905,-0.21168 -2.751664,-0.21168 h -4.233335 c -0.846664,0 -1.904999,0 -2.751663,0.21168 -2.54,-6.561672 -8.043335,-6.561672 -9.948334,-6.561672 -2.1166643,0 -8.4666645,2.116672 -8.4666645,12.699998 0,7.619999 5.2916642,9.736671 8.4666645,10.37167 v 2.328336 c 0,6.984999 5.714999,12.699997 12.699997,12.699997 h 4.233335 c 6.984999,0 12.699998,-5.714998 12.699998,-12.699997 V 33.655 c 3.174999,-0.634959 8.466662,-2.751663 8.466662,-10.371662 0,-10.583334 -6.349999,-12.699998 -8.466662,-12.699998 m -29.63333,19.049997 v 0.846664 c -4.4449993,-1.27 -3.5983323,-6.138335 -1.4816643,-7.831662 -0.63504,-0.846672 -2.751668,0.634959 -2.751668,-0.21168 0,-1.058328 3.8099963,-2.54 4.4449963,-2.751664 -0.63504,-1.058336 -3.1750003,-0.63496 -3.1750003,-1.481664 0,-0.634959 2.5400003,-1.693335 4.6566713,-1.269999 1.058328,0.21168 2.328328,0.63496 3.386664,1.481663 -2.963336,2.751664 -5.079999,6.561663 -5.079999,11.218334 m 7.408334,6.349999 c -4.233335,0 -4.233335,-6.349999 0,-6.349999 4.233327,0 4.233327,6.349999 0,6.349999 m 8.466663,6.349999 h -2.116664 c -1.481672,0 -2.54,-1.481672 -1.905,-2.751672 l 1.481664,-6.349999 c 0.21168,-0.846663 1.058336,-1.269999 1.693336,-1.481663 0.63504,0 1.269999,0.42336 1.693327,1.481663 l 1.481672,6.349999 c 0.21168,1.27 -0.846672,2.751672 -2.328335,2.751672 m 6.349998,-6.349999 c -4.233335,0 -4.233335,-6.349999 0,-6.349999 4.233335,0 4.233335,6.349999 0,6.349999 m 8.889998,-13.546669 c 2.116672,1.693335 2.963336,6.56167 -1.481663,7.83167 0.21168,-4.656671 -1.905,-9.10167 -5.079999,-11.853334 1.058328,-0.846663 2.328327,-1.269999 3.386663,-1.481663 2.116664,-0.42336 4.656671,0.42336 4.656671,1.269999 0,0.846664 -2.540007,0.42336 -3.175007,1.27 0.63496,0.42336 4.445007,1.905 4.445007,2.963328 0,0.846671 -1.905,-0.63496 -2.751672,0 z"
id="path1-5"
style="stroke-width:2.11666;fill:#f1f8e9" /></g></svg>
default_avatars/mouse.svg
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="mouse.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.6965465"
inkscape:cx="231.77794"
inkscape:cy="89.002729"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 40.91516,30.458833 c 2.963335,2.688167 0.994832,7.641166 -2.984496,7.641166 H 19.176996 c -5.947831,0 -10.7103259,-4.762495 -10.7103259,-10.710333 v -0.10584 C 3.598335,26.288994 0,22.034499 0,16.933332 0,11.112501 4.698999,6.3499987 10.583334,6.3499987 h 5.291663 c 0.63504,0 1.058336,-0.4868 1.058336,-1.058336 0,-0.57152 -0.42336,-1.058328 -1.058336,-1.058328 H 10.583334 V 0 h 5.291663 c 2.920999,0 5.291671,2.391832 5.291671,5.2916627 0,2.9421667 -2.370672,5.2916703 -5.291671,5.2916703 h -5.291663 c -3.5136629,0 -6.349999,2.815167 -6.349999,6.349999 0,2.899831 1.947336,5.291663 4.5296631,6.07483 1.185336,-4.656663 5.3551669,-8.191502 10.4139979,-8.191502 1.693336,0 3.386671,0.46568 4.868335,1.164168 -2.984503,1.672167 -4.995335,4.762503 -4.995335,8.36083 0,2.64584 1.058336,5.016503 2.815168,6.709839 l 1.481663,-1.481672 c -1.375831,-1.291168 -2.180159,-3.174999 -2.180159,-5.228167 0,-5.482159 4.952999,-7.408326 7.408326,-7.408326 4.402671,0 8.360831,4.000495 7.281335,8.953494 l 5.058831,4.571999 m -7.048495,3.407831 c 1.185328,0 2.116664,-0.931328 2.116664,-2.116663 0,-1.185336 -0.931336,-2.116664 -2.116664,-2.116664 -1.185336,0 -2.116671,0.931328 -2.116671,2.116664 0,1.185335 0.931335,2.116663 2.116671,2.116663 z"
id="path1-5"
style="stroke-width:2.11666;fill:#fbe9e7"
clip-path="url(#clipPath4)" /></g></svg>
default_avatars/owl.svg
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="owl.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 25.399997,35.98334 c 1.185336,1.778 2.772841,3.238504 4.656673,4.233337 l -4.656673,4.656665 -4.656665,-4.656665 c 1.883832,-0.994833 3.492505,-2.455337 4.656665,-4.233337 M 35.983335,25.823337 a 4.2333344,4.2333344 0 0 0 -4.233337,4.233337 4.2333344,4.2333344 0 0 0 4.233337,4.233329 4.2333344,4.2333344 0 0 0 4.233338,-4.233329 c 0,-2.349504 -1.905001,-4.233337 -4.233338,-4.233337 m -21.166669,0 a 4.2333344,4.2333344 0 0 0 -4.233337,4.233337 4.2333344,4.2333344 0 0 0 4.233337,4.233329 4.2333344,4.2333344 0 0 0 4.233329,-4.233329 c 0,-2.349504 -1.905,-4.233337 -4.233329,-4.233337 m 21.166669,-5.291665 a 8.4666684,8.4666684 0 0 1 8.466675,8.466666 8.4666684,8.4666684 0 0 1 -8.466675,8.466666 8.4666684,8.4666684 0 0 1 -8.466666,-8.466666 8.4666684,8.4666684 0 0 1 8.466666,-8.466666 m -21.166669,0 a 8.4666684,8.4666684 0 0 1 8.466666,8.466666 8.4666684,8.4666684 0 0 1 -8.466666,8.466666 8.4666684,8.4666684 0 0 1 -8.4666702,-8.466666 8.4666684,8.4666684 0 0 1 8.4666702,-8.466666 M 4.7413288,4.2333319 C 8.4666648,12.064998 5.7784948,17.906999 3.2808278,23.706673 2.5188281,25.400001 2.1166616,27.156841 2.1166616,28.998338 A 12.700003,12.700003 0 0 0 14.816666,41.698341 c 0.444481,-0.0216 0.889001,-0.0424 1.333497,-0.10584 l 6.265337,6.265337 2.984497,2.942161 2.984505,-2.942161 6.265337,-6.265337 c 0.44448,0.0632 0.889,0.08464 1.333496,0.10584 A 12.700003,12.700003 0 0 0 48.683339,28.998338 c 0,-1.841497 -0.402161,-3.598337 -1.164169,-5.291665 C 45.021506,17.906999 42.333337,12.064998 46.058674,4.2333319 40.470673,8.5936689 32.511999,12.04383 25.399997,12.064998 18.287995,12.044198 10.329329,8.5936689 4.7413288,4.2333319 Z"
id="path1-7"
style="stroke-width:2.11666;fill:#e0f2f1"
clip-path="url(#clipPath4)" /></g></svg>
default_avatars/panda.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="panda.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 25.4043,11.112501 c 3.683,0 7.112,1.058327 10.033,2.857495 1.354672,-1.735664 3.471336,-2.857495 5.842,-2.857495 a 7.4083335,7.4083335 0 0 1 7.408336,7.408326 c 0,3.175 -2.010832,5.884336 -4.826,6.942672 0.38104,1.524 0.59264,3.06916 0.59264,4.699 a 19.05,19.05 0 0 1 -19.05,19.05 19.05,19.05 0 0 1 -19.0500002,-19.05 c 0,-1.62984 0.21168,-3.175 0.59264,-4.699 -2.815168,-1.058336 -4.826,-3.767672 -4.826,-6.942672 a 7.4083335,7.4083335 0 0 1 7.408328,-7.408326 c 2.3706722,0 4.4873362,1.121831 5.8420002,2.857495 2.921,-1.799168 6.35,-2.857495 10.033,-2.857495 m 0,4.233326 A 14.816667,14.816667 0 0 0 10.58758,30.162499 14.816667,14.816667 0 0 0 25.404244,44.979163 14.816667,14.816667 0 0 0 40.220916,30.162499 14.816667,14.816667 0 0 0 25.404244,15.345827 m 8.86884,11.218336 c 0.762,2.815168 -0.23288,5.524496 -2.201336,6.053664 -1.989664,0.55032 -4.191,-1.312328 -4.953,-4.148664 -0.762,-2.815168 0.2328,-5.524504 2.201336,-6.053664 1.989664,-0.5292 4.191,1.312328 4.953,4.148664 m -17.737672,0 c 0.762,-2.836336 2.963336,-4.677832 4.953,-4.148664 1.968504,0.52912 2.963336,3.238496 2.201336,6.053664 -0.762,2.836336 -2.963336,4.699 -4.953,4.148664 -1.968504,-0.5292 -2.963336,-3.238496 -2.201336,-6.053664 m 8.868832,7.831664 c 1.27,0 2.39184,0.40216 3.175,1.058336 l -2.116664,2.116664 c 0,0.889 0.71968,1.587504 1.587504,1.587504 a 1.5875,1.5875 0 0 0 1.587496,-1.587504 1.0583334,1.0583334 0 0 1 1.058336,-1.058328 1.0583334,1.0583334 0 0 1 1.058328,1.058328 3.7041668,3.7041668 0 0 1 -3.70416,3.704168 c -1.037168,0 -1.968504,-0.42336 -2.64584,-1.121832 -0.67736,0.69848 -1.608664,1.121832 -2.645832,1.121832 a 3.7041668,3.7041668 0 0 1 -3.704168,-3.704168 1.0583334,1.0583334 0 0 1 1.058336,-1.058328 1.0583334,1.0583334 0 0 1 1.058336,1.058328 1.5875,1.5875 0 0 0 1.587496,1.587504 1.5875,1.5875 0 0 0 1.587504,-1.587504 l -2.116672,-2.116664 c 0.7832,-0.65616 1.905,-1.058336 3.175,-1.058336 z"
id="path1-7"
style="stroke-width:2.11666;fill:#fafafa" /></g></svg>
default_avatars/penguin.svg
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="penguin.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 30.941406,21.901154 c -0.889006,0.592644 -3.70419,2.201349 -4.127529,2.518847 -0.825501,0.656164 -1.587505,0.613844 -2.413014,-0.0208 -0.423362,-0.338642 -3.238515,-1.947339 -4.12752,-2.518847 -1.016006,-0.656164 -0.95251,-1.481672 0.169361,-1.947339 3.471356,-1.460513 6.942713,-1.35468 10.392893,0.0632 1.037174,0.444483 1.07951,1.270008 0.105841,1.905011 M 46.223864,37.310654 C 44.255356,32.886795 41.567172,28.8651 38.095816,25.330247 36.973977,24.166072 36.275477,22.853736 35.852139,21.350887 35.640457,20.652403 35.492297,19.932719 35.344136,19.213043 34.920773,17.350368 34.730292,15.445356 33.862463,13.688514 32.317286,10.344158 29.629102,8.6084839 25.734415,8.4603149 c -3.831191,0.105841 -6.688712,1.7145061 -8.36089,5.0800301 -0.444482,0.910173 -0.762004,1.862675 -0.973669,2.836345 -0.359842,1.608681 -0.677364,3.280859 -1.058343,4.910701 -0.317521,1.37584 -0.952501,2.561183 -2.032012,3.619517 -3.407852,3.323188 -6.138367,7.13321 -8.212712,11.324235 -0.296338,0.613844 -0.5926676,1.227679 -0.7831728,1.862683 -0.4021703,1.397008 0.6138358,2.370678 2.0955128,2.032012 0.931336,-0.190481 1.862677,-0.381042 2.751682,-0.656164 0.867837,-0.317522 1.206503,-0.10584 1.418177,0.740805 1.37584,4.550859 4.381522,7.747046 8.974717,9.525056 8.720723,3.30202 18.901944,-1.397008 21.103293,-9.694393 0.14816,-0.571524 0.359842,-0.783205 0.994837,-0.571524 0.973678,0.296322 1.968516,0.508003 2.963354,0.740805 1.037174,0.190481 1.799179,-0.338642 1.947347,-1.354672 0.0632,-0.550324 -0.12704,-1.037174 -0.338642,-1.545177"
id="path1-6"
style="fill:#e0f7fa;stroke-width:2.11668" /></g></svg>
default_avatars/pig.svg
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="pig.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.5738353"
inkscape:cx="123.1625"
inkscape:cy="130.15596"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 37.740147,22.224997 -4.80484,-4.804832 c 0.14816,-0.889001 0.38104,-1.714505 0.67736,-2.434169 0.16936,-0.38096 0.254,-0.7832 0.254,-1.227664 0,-1.756832 -1.418169,-3.175 -3.175001,-3.175 -3.471336,0 -6.540504,1.672168 -8.466664,4.233328 H 11.641665 C 5.207,14.81666 0,20.023669 0,26.458333 0,32.892998 5.291664,50.799999 5.291664,50.799999 h 11.641665 v -4.233328 h 4.233337 v 4.233328 H 32.80833 l 3.556001,-11.832169 5.969,-1.989664 V 22.224997 h -4.59316 m -8.106841,7.408336 c -1.164168,0 -2.116664,-0.952504 -2.116664,-2.116664 0,-1.164168 0.952496,-2.116672 2.116664,-2.116672 1.164168,0 2.116672,0.952504 2.116672,2.116672 0,1.16416 -0.952504,2.116664 -2.116672,2.116664 z"
id="path1-9"
style="stroke-width:2.11666;fill:#fce4ec"
clip-path="url(#clipPath3)" /></g></svg>
default_avatars/rabbit.svg
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="rabbit.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.2511626"
inkscape:cx="85.289262"
inkscape:cy="161.69423"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="M 33.161072,50.800007 27.382562,40.76699 c 0,-3.661838 -2.264837,-6.011338 -5.016508,-6.011338 -1.905004,0 -3.556007,1.05833 -4.402675,2.624669 0.698498,-0.402161 1.524003,-0.613841 2.391838,-0.613841 2.751672,0 4.995342,2.243667 4.995342,4.995344 0,2.772837 -2.222504,5.037673 -4.995342,5.037673 h 6.985011 v 4.000502 H 9.3273642 c -0.508001,0 -1.037169,-0.19048 -1.41817,-0.592641 -0.783169,-0.783201 -0.783169,-2.053163 0,-2.836332 v 0 l 1.058336,-1.058338 c -0.719666,-0.317521 -1.312336,-0.804338 -1.905004,-1.312338 -0.465664,1.058337 -1.524002,1.799171 -2.751671,1.799171 -1.6510019,0 -3.0056708,-1.354667 -3.0056708,-3.026837 0,-1.651003 1.3546689,-3.005678 3.0056708,-3.005678 l 0.994835,0.169361 v -4.169839 c 0,-5.545674 4.466175,-10.033017 10.0330178,-10.033017 h 0.04232 c 4.487341,0.0216 7.979847,1.778003 7.979847,-0.994834 0,-1.968507 0.423337,-2.751677 1.143002,-3.852342 -1.54517,-0.719682 -3.302005,-1.16417 -5.143509,-1.16417 -1.121835,0 -2.010837,-0.889002 -2.010837,-2.010836 0,-0.910169 0.592665,-1.672171 1.418169,-1.926171 l -1.418155,-0.08464 c -1.100669,0 -2.010837,-0.889003 -2.010837,-1.98967 0,-1.121841 0.910168,-2.010843 2.010837,-2.010843 h 2.010837 c 4.445008,0 8.339681,2.434173 10.435184,6.032516 l 0.592665,-0.0216 c 1.502836,0 2.899839,0.486801 4.042841,1.29117 l 0.952501,0.80433 c 4.593175,4.127511 4.021674,6.921515 4.021674,6.942683 0,2.709333 -2.243671,4.931841 -4.974175,4.931841 l -1.037166,-0.10584 v 0.16936 c 0,2.3495 -1.016002,4.445007 -2.603504,5.926674 l 7.006178,12.128516 h -4.635508 m 0.232832,-28.067047 c -1.121835,0 -2.010837,0.889001 -2.010837,1.989675 0,1.121834 0.889002,2.010836 2.010837,2.010836 1.100669,0 2.010837,-0.889002 2.010837,-2.010836 0,-1.100674 -0.910168,-1.989675 -2.010837,-1.989675 z"
id="path1-7"
style="fill:#e0f2f1;stroke-width:2.11667"
clip-path="url(#clipPath3)" /></g></svg>
default_avatars/sea-turtle.svg
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="sea-turtle.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="5.2352457"
inkscape:cx="76.596215"
inkscape:cy="103.52905"
inkscape:current-layer="layer1"
showguides="false" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5"><circle
style="fill:#4caf50;stroke-width:3.175;stroke-miterlimit:8"
id="circle6"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 17.928156,13.324415 c 1.015999,-0.592639 2.116662,-1.079503 3.238494,-1.418167 V 9.1969136 c 0,-2.328327 1.841503,-4.2333258 4.16983,-4.2968298 2.455334,0.0632 4.296837,1.9685028 4.296837,4.2968299 v 2.7093343 c 1.121832,0.35984 2.222495,0.825504 3.238494,1.418167 l -3.386662,4.487335 h -8.170331 l -3.386662,-4.487335 m 22.288483,12.805826 c 0,1.058336 -0.105839,2.010831 -0.296319,2.963334 l -5.355157,-1.650999 -2.518831,-7.746996 3.386662,-4.466165 c 0.910168,0.846663 1.714495,1.799166 2.412999,2.857502 1.672167,-0.14816 3.28083,0.105841 4.720165,0.825495 2.180167,1.121833 3.66183,3.259663 4.000494,5.69383 l -6.349997,0.762 c 0,0.254 0,0.507999 0,0.761999 m -29.633311,0 c 0,-0.254 0,-0.508 0,-0.740799 l -6.349996,-0.7832 c 0.33864,-2.434167 1.820327,-4.571997 4.000494,-5.69383 1.439335,-0.719678 3.069165,-0.973662 4.6355,-0.698478 0.69848,-1.079504 1.502831,-2.074336 2.455327,-2.942168 l 3.428998,4.402661 -2.518831,7.768164 -5.355165,1.650999 c -0.19048,-0.952504 -0.296319,-1.904999 -0.296319,-2.963335 m 11.091322,-5.143493 h 7.450667 l 2.307159,7.111997 -6.032492,4.381494 -6.032501,-4.381494 2.307167,-7.111997 m -4.466166,9.482659 6.603996,4.783663 v 5.609163 C 22.606009,40.735208 21.441842,40.460088 20.362346,40.05792 l -2.603502,5.841997 c -2.243663,-0.99484 -3.852334,-3.047999 -4.275662,-5.460997 -0.29632,-1.608671 -0.0424,-3.217334 0.67736,-4.656669 -0.952496,-1.100663 -1.735663,-2.328327 -2.328327,-3.682998 l 5.376325,-1.629832 m 16.382991,0 5.376333,1.629832 c -0.59264,1.354672 -1.375831,2.582335 -2.328335,3.682998 0.71968,1.439335 0.973672,3.047998 0.69848,4.656669 -0.44448,2.412998 -2.053167,4.466158 -4.29683,5.460997 L 30.458845,40.05792 c -1.121832,0.402161 -2.243663,0.761999 -3.471334,0.888999 v -5.693835 z"
id="path1-6"
style="fill:#e0f2f1;stroke-width:2.11666" /></g></svg>
default_avatars/shark.svg
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="shark.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="1.9897878"
inkscape:cx="118.60561"
inkscape:cy="128.65694"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3"><circle
style="fill:#e91e63;stroke-width:3.175;stroke-miterlimit:8"
id="circle4"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
r="25.4"
cy="25.4"
cx="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#2196f3;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
r="25.4"
cy="25.4"
cx="25.4" /><path
d="m 46.566647,39.440406 v 4.233336 h -4.233328 c -2.963336,0 -5.926672,-0.846672 -8.466672,-2.116672 -5.291663,2.751672 -11.641663,2.751672 -16.933327,0 -2.54,1.27 -5.503335,2.116672 -8.4666708,2.116672 h -4.233328 v -4.233336 h 4.233328 c 2.9633358,0 5.9266708,-1.058336 8.4666708,-2.751663 5.08,3.598327 11.853328,3.598327 16.933327,0 2.54,1.693327 5.503336,2.751663 8.466672,2.751663 h 4.233328 M 11.175985,34.762575 c 1.143,-0.33864 2.307168,-0.867832 3.407831,-1.587504 l 2.413,-1.629832 2.391832,1.693336 c 1.778,1.248832 3.894672,1.968496 6.011336,1.968496 2.116664,0 4.233336,-0.71968 6.011336,-1.968496 l 2.391831,-1.693336 2.413,1.629832 c 1.735664,1.164168 3.640664,1.820336 5.418664,1.968504 C 38.607983,21.237071 26.183152,9.8070725 12.699985,9.8070725 c -0.7408,0 -1.418168,0.3810395 -1.799168,0.9948315 -0.38104,0.63504 -0.42336,1.418168 -0.08464,2.074336 4.593167,9.186335 3.174999,16.594671 0.35984,21.886335 m 22.690662,10.392831 c -5.079999,3.598336 -11.853327,3.598336 -16.933327,0 -2.54,1.693336 -5.503335,2.751664 -8.4666707,2.751664 h -4.233328 v 4.233336 h 4.233328 c 2.9633357,0 5.9266707,-0.846664 8.4666707,-2.116664 5.291664,2.751664 11.641664,2.751664 16.933327,0 2.54,1.27 5.503336,2.116664 8.466672,2.116664 h 4.233328 V 47.90707 h -4.233328 c -2.963336,0 -5.926672,-1.058328 -8.466672,-2.751664 z"
id="path1-5"
style="stroke-width:2.11666;fill:#e3f2fd"
clip-path="url(#clipPath1)" /></g></svg>
default_avatars/sheep.svg
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="sheep.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="1.192474"
inkscape:cx="-23.480597"
inkscape:cy="156.81684"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 42.333322,17.991695 a 5.2916644,5.2916644 0 0 1 -5.291664,5.291662 c -2.285999,0 -4.233331,-1.460496 -4.952998,-3.471327 -0.931333,0.825496 -2.158999,1.354664 -3.513665,1.354664 -1.185332,0 -2.285999,-0.40216 -3.174999,-1.058336 -0.888999,0.65616 -1.968499,1.058336 -3.174998,1.058336 -1.354666,0 -2.582332,-0.5292 -3.513665,-1.354664 -0.719664,2.010831 -2.666999,3.471327 -4.952998,3.471327 A 5.2916644,5.2916644 0 0 1 8.4666704,17.991695 c 0,-2.624663 1.9261656,-4.80483 4.4449976,-5.206998 -0.127,-0.35984 -0.211664,-0.740799 -0.211664,-1.142999 a 3.1749986,3.1749986 0 0 1 3.174999,-3.1749986 c 0.423336,0 0.825499,0.08464 1.185333,0.2328 0.359832,-1.354663 1.587499,-2.349503 3.047999,-2.349503 0.529167,0 1.058333,0.14816 1.439332,0.35984 0.677336,-1.4181671 2.137832,-2.476503 3.852332,-2.476503 1.714499,0 3.174998,1.0583359 3.852332,2.476503 0.380999,-0.21168 0.910166,-0.35984 1.439332,-0.35984 1.4605,0 2.688166,0.9948319 3.047999,2.349495 0.359832,-0.14816 0.762,-0.2328 1.185332,-0.2328 a 3.1749986,3.1749986 0 0 1 3.174999,3.1749986 c 0,0.40216 -0.08466,0.783199 -0.211664,1.142999 2.518833,0.40216 4.444998,2.582335 4.444998,5.206998 M 21.166668,25.40002 a 2.1166658,2.1166658 0 0 0 -2.116667,2.116663 2.1166658,2.1166658 0 0 0 2.116667,2.116663 2.1166658,2.1166658 0 0 0 2.116665,-2.116663 2.1166658,2.1166658 0 0 0 -2.116665,-2.116663 m 8.466662,0 a 2.1166658,2.1166658 0 0 0 -2.116665,2.116663 2.1166658,2.1166658 0 0 0 2.116665,2.116663 2.1166658,2.1166658 0 0 0 2.116666,-2.116663 2.1166658,2.1166658 0 0 0 -2.116666,-2.116663 m 13.186828,-2.836335 c -1.354666,1.714503 -3.428998,2.836335 -5.778497,2.836335 -0.9525,0 -1.862667,-0.21168 -2.730499,-0.57152 -0.0212,5.397502 -0.804333,11.916827 -3.725332,15.28233 -1.100666,1.248831 -2.434165,1.926167 -4.127498,2.137831 v -4.148663 h -2.116666 v 4.148663 c -1.693333,-0.21168 -3.026832,-0.867832 -4.127498,-2.137831 -2.942166,-3.386663 -3.725332,-9.86366 -3.746498,-15.261162 -0.846667,0.33864 -1.756833,0.55032 -2.709333,0.55032 -2.349499,0 -4.423831,-1.121832 -5.7784968,-2.836335 -1.8838328,1.883831 -3.7464984,2.836335 -3.7464984,2.836335 0,0 2.1166655,4.233326 6.3499972,4.233326 0.761999,0 1.354665,-0.08464 1.862665,-0.19048 0.719664,8.085669 3.598332,17.123833 12.953995,17.123833 9.355663,0 12.234328,-9.038164 12.953994,-17.123833 0.508,0.10584 1.100667,0.19048 1.862666,0.19048 4.233332,0 6.349998,-4.233326 6.349998,-4.233326 0,0 -1.862666,-0.952504 -3.746499,-2.836335 z"
id="path1-2"
style="stroke-width:2.11666;fill:#efebe9" /></g></svg>
default_avatars/snail.svg
@@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="snail.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 41.326269,23.346833 1.968503,-6.519332 c 0.910159,-0.211679 1.608663,-1.015999 1.608663,-2.01083 0,-1.164168 -0.952503,-2.116671 -2.116663,-2.116671 -1.164167,0 -2.11667,0.952503 -2.11667,2.116671 0,0.550319 0.2328,1.058327 0.571519,1.439327 l -1.629831,5.460996 -1.629839,-5.460996 c 0.33864,-0.38104 0.57152,-0.889 0.57152,-1.439327 0,-1.164168 -0.952495,-2.116671 -2.116663,-2.116671 -1.164167,0 -2.116662,0.952503 -2.116662,2.116671 0,0.994831 0.698479,1.799167 1.608663,2.01083 l 1.968494,6.519332 c -2.031998,0.31752 -3.577165,2.053159 -3.577165,4.16983 v 4.762493 C 31.462643,25.738664 25.070311,21.166667 17.619652,21.166667 c -8.2973308,0 -15.0494937,6.900323 -15.0494937,15.36699 0,3.894662 1.7356649,7.387164 4.4449969,9.71549 l -2.582332,0.31752 c -1.058333,0.12704 -1.8626649,1.058335 -1.8626649,2.116671 0,1.164159 0.9524999,2.116662 2.1166649,2.116662 H 38.807471 c 2.201334,0 3.979333,-1.777999 3.979333,-3.979333 V 31.157341 c 1.27,-0.71968 2.116663,-2.074335 2.116663,-3.640662 0,-2.116671 -1.545167,-3.852334 -3.577166,-4.16983 m -9.969498,19.854316 -7.471827,0.952503 c 0.910168,-1.608671 1.545167,-3.492501 1.545167,-5.503332 0,-4.910661 -3.915829,-8.889995 -8.741826,-8.889995 -1.121832,0 -2.222503,0.254 -3.238502,0.7408 -1.03716,0.5292 -1.481664,1.799167 -0.952496,2.836334 0.508,1.058328 1.777999,1.481663 2.836334,0.973664 0.42336,-0.21168 0.889,-0.31752 1.354664,-0.31752 2.497662,0 4.508493,2.074335 4.508493,4.656661 0,3.51367 -2.751663,6.371164 -6.159492,6.371164 -4.529662,0 -8.2338268,-3.809998 -8.2338268,-8.487827 0,-6.138332 4.8471648,-11.133657 10.8161608,-11.133657 7.746995,0 14.054655,6.476996 14.054655,14.435655 0,1.142999 -0.12704,2.264831 -0.31752,3.365494 z"
id="path1-9"
style="stroke-width:2.11666;fill:#efebe9"
clip-path="url(#clipPath10)" /></g></svg>
default_avatars/snake.svg
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="snake.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 41.274986,40.216664 h -3.175007 c 2.328335,0 4.233335,-1.905 4.233335,-4.233327 0,-2.328336 -1.905,-4.233336 -4.233335,-4.233336 v -8.466664 c 0,-2.116672 0,-4.233336 -2.286,-6.053671 0.10584,-0.44448 0.16936,-0.889 0.16936,-1.354664 0,-4.085168 -4.233328,-7.4083358 -9.525,-7.4083358 -4.783664,0 -8.720663,2.7728318 -9.376831,6.3499998 h -4.381504 l -4.84716,-4.677832 -1.502837,1.502832 4.233333,4.233336 -4.233333,4.233335 1.502837,1.502832 4.84716,-4.677831 h 4.381504 c 0.65616,3.577167 4.593167,6.349999 9.376831,6.349999 1.058336,0 2.116664,-0.16936 3.026832,-0.42336 0.08464,0.14816 0.14816,0.29632 0.14816,0.42336 v 8.466664 H 16.933332 c -2.328336,0 -4.233336,1.905 -4.233336,4.233336 0,2.328327 1.905,4.233327 4.233336,4.233327 h -3.175 c -2.921,0 -5.291664,2.370672 -5.291664,5.291672 0,0.35984 0,0.71968 0.10584,1.058328 h -0.10584 c -2.328335,0 -4.2333349,1.905 -4.2333349,4.233336 H 41.275002 c 2.921,0 5.291664,-2.370664 5.291664,-5.291664 0,-2.921 -2.370664,-5.291672 -5.291664,-5.291672 M 25.399995,14.816666 c -1.16416,0 -2.116664,-0.952496 -2.116664,-2.116664 0,-1.164168 0.952504,-2.116664 2.116664,-2.116664 1.164168,0 2.116672,0.952496 2.116672,2.116664 0,1.164168 -0.952504,2.116664 -2.116672,2.116664 z"
id="path1-6"
style="stroke-width:2.11666;fill:#e0f7fa"
clip-path="url(#clipPath6)" /></g></svg>
default_avatars/spider.svg
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="spider.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="1.192474"
inkscape:cx="-23.480597"
inkscape:cy="3.354371"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#607d8b;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 27.516665,0 v 10.752665 a 11.578168,11.578168 0 0 0 -2.116668,-0.16936 11.578168,11.578168 0 0 0 -2.116666,0.16936 V 0 m 12.488335,27.516668 a 10.583335,10.583335 0 0 1 -0.359832,1.164168 l 6.921501,3.958168 v 9.69433 h -4.233336 v -7.239001 l -4.783667,-2.730497 a 10.456335,10.456335 0 0 1 -15.832669,0 l -4.783667,2.730497 v 7.239001 H 8.4666619 v -9.69433 L 15.388163,28.680836 A 10.583335,10.583335 0 0 1 15.02833,27.516668 H 11.218329 L 5.3974951,31.390172 3.0691612,27.8765 9.9483293,23.283331 H 15.02833 a 10.583335,10.583335 0 0 1 0.571499,-1.862664 l -3.302,-2.116664 -7.5565012,1.862664 -1.0160001,-4.233337 9.3768343,-2.286 4.889501,3.238504 a 10.583335,10.583335 0 0 1 14.816669,0 l 4.804834,-3.238504 9.461502,2.286 -1.016,4.233337 -7.556501,-1.883832 -3.302001,2.116664 a 10.583335,10.583335 0 0 1 0.571504,1.883832 h 5.080001 l 6.879167,4.572001 -2.328337,3.513672 -5.820834,-3.852336 M 23.283331,25.400003 a 2.116667,2.116667 0 1 0 -2.116667,2.116665 2.116667,2.116667 0 0 0 2.116667,-2.116665 m 8.466667,0 a 2.116667,2.116667 0 1 0 -2.116666,2.116665 2.116667,2.116667 0 0 0 2.116666,-2.116665 z"
id="path1-5"
style="stroke-width:2.11666;fill:#eceff1"
clip-path="url(#clipPath1)" /></g></svg>
default_avatars/tortoise.svg
@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="tortoise.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="5.2352457"
inkscape:cx="76.596215"
inkscape:cy="103.52905"
inkscape:current-layer="layer1"
showguides="false" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10"><circle
style="fill:#795548;stroke-width:3.175;stroke-miterlimit:8"
id="circle11"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#616161;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5"><circle
style="fill:#4caf50;stroke-width:3.175;stroke-miterlimit:8"
id="circle6"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#4caf50;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 44.183515,21.452088 c -2.582292,-0.08464 -5.143416,1.904967 -5.947738,5.079912 -1.05831,4.233264 -1.05831,4.233264 -3.174946,6.349892 -4.233256,4.233264 -10.583148,6.349892 -23.282931,8.46652 -2.1166362,0.338634 -3.1749459,1.058318 -4.2332639,2.116636 4.2332639,0 8.4665199,0 5.2915739,3.174946 L 9.6612638,49.81494 h 6.3498922 l 4.233263,-4.233264 c 4.233264,2.116628 7.048384,2.116628 11.28164,0 l 1.418144,4.233264 h 6.349892 l -2.116628,-6.349892 c 0,0 2.116628,-8.466527 4.233256,-10.583156 2.116636,-2.116628 2.116636,0 4.233263,0 2.116636,0 4.233264,-2.116628 4.233264,-5.291574 0,-1.058318 0,-3.174945 -3.174946,-5.291581 -0.740787,-0.507992 -1.608636,-0.804315 -2.518789,-0.84665 m -21.822468,0.84665 A 12.699783,12.699783 0 0 0 9.6612638,34.99852 c 0,1.269978 0.275195,2.285961 0.4868722,3.386614 12.53045,-2.0743 19.176673,-4.254431 22.647941,-7.746868 l 1.058318,-1.058317 C 31.758927,25.135024 27.271676,22.298737 22.361087,22.298737 Z"
id="path1-7"
style="fill:#e8f5e9;stroke-width:2.11663"
clip-path="url(#clipPath5)" /></g></svg>
default_avatars/turkey.svg
@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="turkey.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="3.2971429"
inkscape:cx="46.403812"
inkscape:cy="132.2357"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath2"><circle
style="fill:#ffeb3b;stroke-width:3.175;stroke-miterlimit:8"
id="circle3"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4"><circle
style="fill:#009688;stroke-width:3.175;stroke-miterlimit:8"
id="circle5"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6"><circle
style="fill:#00bcd4;stroke-width:3.175;stroke-miterlimit:8"
id="circle7"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath8"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="circle9"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#ff5722;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 17.991664,45.381335 c -1.587496,0.762 -3.386663,1.185328 -5.291663,1.185328 C 5.6938328,46.566663 1.6185303e-6,40.872831 1.6185303e-6,33.866664 V 23.283336 C 1.6185303e-6,16.277169 5.6938328,10.583337 12.700001,10.583337 l 5.291663,9.694327 c -5.079999,2.603504 -8.4666632,7.239 -8.4666632,12.530672 0,5.291663 3.4078322,9.948327 8.4666632,12.572999 m 11.641672,-1.058336 v 2.243664 H 31.75 c 1.164168,0 2.116664,0.952504 2.116664,2.116672 0,1.164168 -0.952496,2.116664 -2.116664,2.116664 H 25.4 c -1.164168,0 -2.116664,-0.952496 -2.116664,-2.116664 0,-1.164168 0.952496,-2.116672 2.116664,-2.116672 V 44.322999 C 18.224504,43.518663 12.700001,38.671503 12.700001,32.808336 c 0,-6.434672 6.625167,-11.641672 14.816663,-11.641672 0.40216,0 0.7832,0 1.185336,0 -1.524,-2.899832 -3.302,-5.863167 -3.302,-8.466663 0,-2.328336 1.905,-4.2333362 4.233336,-4.2333362 4.677831,0 8.466663,3.7888322 8.466663,8.4666722 h -4.233335 c 0,0 8.466671,6.349999 8.466671,15.874999 0,5.863167 -5.524504,10.710327 -12.699999,11.514663 m 0,-31.622998 c 0,1.164168 0.952496,2.116664 2.116664,2.116664 1.164168,0 2.116664,-0.952496 2.116664,-2.116664 0,-1.164168 -0.952496,-2.116664 -2.116664,-2.116664 -1.164168,0 -2.116664,0.952496 -2.116664,2.116664 M 31.75,29.633336 C 31.75,27.305 29.866168,25.4 27.516664,25.4 22.838832,25.4 19.05,29.188832 19.05,33.866664 h 8.466664 c 2.349504,0 4.233336,-1.883832 4.233336,-4.233328 z"
id="path1-6"
style="stroke-width:2.11666;fill:#fbe9e7"
clip-path="url(#clipPath8)" /></g></svg>
default_avatars/unicorn.svg
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="192"
height="192"
viewBox="0 0 50.800001 50.8"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
sodipodi:docname="unicorn.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.5738353"
inkscape:cx="123.1625"
inkscape:cy="130.15596"
inkscape:current-layer="layer1" /><defs
id="defs1"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1"><circle
style="fill:#673ab7;stroke-width:3.175;stroke-miterlimit:8"
id="circle2"
cx="25.4"
cy="25.4"
r="25.4" /></clipPath></defs><g
inkscape:label="Strat 1"
inkscape:groupmode="layer"
id="layer1"><circle
style="fill:#673ab7;stroke-width:3.175;stroke-miterlimit:8"
id="path1"
cx="25.4"
cy="25.4"
r="25.4" /><path
d="m 43.359999,7.439591 -3.76767,5.672674 c 2.286,1.524 3.76767,4.106338 3.76767,7.02733 v 14.816678 l -6.35,2.116672 -6.519334,-10.414004 c -0.5504,-0.88896 -1.947328,-0.508 -1.947328,0.55024 v 15.15535 c 0,4.148656 -1.65101,7.874002 -4.233346,10.710338 V 79.40621 H 13.726659 V 58.239527 c -0.33872,0 -0.67728,0 -1.0584,0 -0.88896,0 -1.778,-0.1264 -2.624672,-0.25392 l -19.811992,-3.302 -3.725344,8.297346 4.106338,16.425337 h -10.922004 l -3.894674,-15.663337 c -0.29632,-1.14304 -0.16928,-2.370672 0.29632,-3.386672 l 3.767666,-8.466676 c -3.72533,-2.455328 -6.222994,-6.604002 -6.350002,-11.387668 -0.16928,0.635042 -0.25408,1.566402 -0.1264,2.92101 0.1264,1.862656 0.59264,4.614322 0.29632,7.662322 -0.16928,3.048002 -1.524,6.180674 -3.302002,8.25501 -1.862672,2.074338 -3.852336,3.513666 -5.96901,4.614338 l -2.963328,-2.963344 c 0.80432,-1.989666 1.608672,-3.767666 1.778,-5.418658 0.25408,-1.5664 -0.0416,-2.836338 -0.508,-3.979346 l -2.243664,-4.783666 c -0.88896,-2.158992 -1.989666,-5.291664 -1.778002,-8.974658 0.1264,-3.598338 2.116658,-8.297346 5.884338,-10.879684 3.810002,-2.58232 7.916324,-2.963328 11.26066,-2.243664 2.116674,0.42336 4.275666,1.43936 6.138338,2.878672 1.5664,-0.71968 3.386674,-1.10064 5.291666,-1.10064 h 24.341672 v -2.116656 c 0,-9.355684 7.577682,-16.93335 16.93335,-16.93335 L 43.360489,-5.260381 39.127159,7.439623 Z"
id="path1-2"
style="stroke-width:4.23332;fill:#ede7f6"
clip-path="url(#clipPath1)" /></g></svg>
gitHTTP.py
@@ -1,128 +0,0 @@
import uuid
from models import *
from app import app, gitCommand, getPermissionLevel, getVisibility, db, bcrypt
import os
import shutil
import config
import flask
import git
import subprocess
from flask_httpauth import HTTPBasicAuth
import zlib
import re
import datetime
auth = HTTPBasicAuth(realm=config.AUTH_REALM)
authRequired = flask.Response("Unauthorized Access", 401, {"WWW-Authenticate": 'Basic realm="Login Required"'})
@auth.verify_password
def verifyPassword(username, password):
user = User.query.filter_by(username=username).first()
if user and bcrypt.check_password_hash(user.passwordHashed, password):
flask.g.user = username
return True
return False
@app.route("/<username>/<repository>/git-upload-pack", methods=["POST"])
@app.route("/git/<username>/<repository>/git-upload-pack", methods=["POST"])
@auth.login_required(optional=True)
def gitUploadPack(username, repository):
if auth.current_user() is None and not getVisibility(username, repository):
return authRequired
if not (getVisibility(username, repository) or getPermissionLevel(flask.g.user, username, repository) is not None):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository, ".git")
text = gitCommand(serverRepoLocation, flask.request.data, "upload-pack", "--stateless-rpc", ".")
return flask.Response(text, content_type="application/x-git-upload-pack-result")
@app.route("/<username>/<repository>/git-receive-pack", methods=["POST"])
@app.route("/git/<username>/<repository>/git-receive-pack", methods=["POST"])
@auth.login_required
def gitReceivePack(username, repository):
if not getPermissionLevel(flask.g.user, username, repository):
flask.abort(403)
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository, ".git")
text = gitCommand(serverRepoLocation, flask.request.data, "receive-pack", "--stateless-rpc", ".")
sha = flask.request.data.split(b" ", 2)[1].decode()
info = gitCommand(serverRepoLocation, None, "show", "-s", "--format='%H%n%at%n%cn <%ce>%n%B'", sha).decode()
if re.match("^[0-9a-fA-F]{40}$", info[:40]):
print(info.split("\n", 3))
sha, time, identity, body = info.split("\n", 3)
login = flask.g.user
if not Commit.query.filter_by(identifier=f"/{username}/{repository}/{sha}").first():
user = User.query.filter_by(username=login).first()
repo = Repo.query.filter_by(route=f"/{username}/{repository}").first()
commit = Commit(sha, user, repo, time, body, identity)
db.session.add(commit)
db.session.commit()
return flask.Response(text, content_type="application/x-git-receive-pack-result")
@app.route("/<username>/<repository>/info/refs", methods=["GET", "POST"])
@app.route("/git/<username>/<repository>/info/refs", methods=["GET", "POST"])
@auth.login_required(optional=True)
def gitInfoRefs(username, repository):
serverRepoLocation = os.path.join(config.REPOS_PATH, username, repository, ".git")
repo = git.Repo(serverRepoLocation)
repoData = Repo.query.filter_by(route=f"/{username}/{repository}").first()
if not repoData.defaultBranch:
if repo.heads:
repoData.defaultBranch = repo.heads[0].name
repo.git.checkout("-f", repoData.defaultBranch)
if auth.current_user() is None and (not getVisibility(username, repository) or flask.request.args.get("service") == "git-receive-pack"):
return authRequired
try:
if not (getVisibility(username, repository) or getPermissionLevel(flask.g.user, username, repository) is not None):
flask.abort(403)
except AttributeError:
return authRequired
service = flask.request.args.get("service")
if service.startswith("git"):
service = service[4:]
else:
flask.abort(403)
if service == "receive-pack":
try:
if not getPermissionLevel(flask.g.user, username, repository):
flask.abort(403)
except AttributeError:
return authRequired
serviceLine = f"# service=git-{service}\n"
serviceLine = (f"{len(serviceLine) + 4:04x}" + serviceLine).encode()
if service == "upload-pack":
text = serviceLine + b"0000" + gitCommand(serverRepoLocation, None, "upload-pack", "--stateless-rpc", "--advertise-refs", "--http-backend-info-refs", ".")
elif service == "receive-pack":
refs = gitCommand(serverRepoLocation, None, "receive-pack", "--http-backend-info-refs", ".")
text = serviceLine + b"0000" + refs
else:
flask.abort(403)
response = flask.Response(text, content_type=f"application/x-git-{service}-advertisement")
response.headers["Cache-Control"] = "no-cache"
return response
git_http.py
@@ -0,0 +1,130 @@
import uuid
from models import *
from app import app, git_command, get_permission_level, get_visibility, db, bcrypt
import os
import shutil
import config
import flask
import git
import subprocess
from flask_httpauth import HTTPBasicAuth
import zlib
import re
import datetime
auth = HTTPBasicAuth(realm=config.AUTH_REALM)
auth_required = flask.Response("Unauthorized Access", 401, {"WWW-Authenticate": 'Basic realm="Login Required"'})
@auth.verify_password
def verify_password(username, password):
user = User.query.filter_by(username=username).first()
if user and bcrypt.check_password_hash(user.passwordHashed, password):
flask.g.user = username
return True
return False
@app.route("/<username>/<repository>/git-upload-pack", methods=["POST"])
@app.route("/git/<username>/<repository>/git-upload-pack", methods=["POST"])
@auth.login_required(optional=True)
def git_upload_pack(username, repository):
if auth.current_user() is None and not get_visibility(username, repository):
return auth_required
if not (get_visibility(username, repository) or get_permission_level(flask.g.user, username,
repository) is not None):
flask.abort(403)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository, ".git")
text = git_command(server_repo_location, flask.request.data, "upload-pack", "--stateless-rpc", ".")
return flask.Response(text, content_type="application/x-git-upload-pack-result")
@app.route("/<username>/<repository>/git-receive-pack", methods=["POST"])
@app.route("/git/<username>/<repository>/git-receive-pack", methods=["POST"])
@auth.login_required
def git_receive_pack(username, repository):
if not get_permission_level(flask.g.user, username, repository):
flask.abort(403)
server_repo_location = os.path.join(config.REPOS_PATH, username, repository, ".git")
text = git_command(server_repo_location, flask.request.data, "receive-pack", "--stateless-rpc", ".")
sha = flask.request.data.split(b" ", 2)[1].decode()
info = git_command(server_repo_location, None, "show", "-s", "--format='%H%n%at%n%cn <%ce>%n%B'", sha).decode()
if re.match("^[0-9a-fA-F]{40}$", info[:40]):
print(info.split("\n", 3))
sha, time, identity, body = info.split("\n", 3)
login = flask.g.user
if not Commit.query.filter_by(identifier=f"/{username}/{repository}/{sha}").first():
user = User.query.filter_by(username=login).first()
repo = Repo.query.filter_by(route=f"/{username}/{repository}").first()
commit = Commit(sha, user, repo, time, body, identity)
db.session.add(commit)
db.session.commit()
return flask.Response(text, content_type="application/x-git-receive-pack-result")
@app.route("/<username>/<repository>/info/refs", methods=["GET", "POST"])
@app.route("/git/<username>/<repository>/info/refs", methods=["GET", "POST"])
@auth.login_required(optional=True)
def git_info_refs(username, repository):
server_repo_location = os.path.join(config.REPOS_PATH, username, repository, ".git")
repo = git.Repo(server_repo_location)
repo_data = Repo.query.filter_by(route=f"/{username}/{repository}").first()
if not repo_data.defaultBranch:
if repo.heads:
repo_data.defaultBranch = repo.heads[0].name
repo.git.checkout("-f", repo_data.defaultBranch)
if auth.current_user() is None and (
not get_visibility(username, repository) or flask.request.args.get("service") == "git-receive-pack"):
return auth_required
try:
if not (get_visibility(username, repository) or get_permission_level(flask.g.user, username,
repository) is not None):
flask.abort(403)
except AttributeError:
return auth_required
service = flask.request.args.get("service")
if service.startswith("git"):
service = service[4:]
else:
flask.abort(403)
if service == "receive-pack":
try:
if not get_permission_level(flask.g.user, username, repository):
flask.abort(403)
except AttributeError:
return auth_required
service_line = f"# service=git-{service}\n"
service_line = (f"{len(service_line) + 4:04x}" + service_line).encode()
if service == "upload-pack":
text = service_line + b"0000" + git_command(server_repo_location, None, "upload-pack", "--stateless-rpc",
"--advertise-refs", "--http-backend-info-refs", ".")
elif service == "receive-pack":
refs = git_command(server_repo_location, None, "receive-pack", "--http-backend-info-refs", ".")
text = service_line + b"0000" + refs
else:
flask.abort(403)
response = flask.Response(text, content_type=f"application/x-git-{service}-advertisement")
response.headers["Cache-Control"] = "no-cache"
return response
jinjaUtils.py
@@ -1,17 +0,0 @@
from app import app
from datetime import datetime
@app.template_filter("split")
def split(value: str, separator=" ", maxsplit: int = -1):
return value.split(separator, maxsplit)
@app.template_filter("strftime")
def strftime(value: datetime, syntax: str):
return value.strftime(syntax)
@app.template_filter("unixtime")
def strftime(value: datetime):
return round(value.timestamp())
jinja_utils.py
@@ -0,0 +1,17 @@
from app import app
from datetime import datetime
@app.template_filter("split")
def split(value: str, separator=" ", maxsplit: int = -1):
return value.split(separator, maxsplit)
@app.template_filter("strftime")
def strftime(value: datetime, syntax: str):
return value.strftime(syntax)
@app.template_filter("unixtime")
def strftime(value: datetime):
return round(value.timestamp())
markdown.py
@@ -63,7 +63,7 @@ class Emphasis(Element):
return f"Emphasis ({self.value}): " + self.content
def _parseLine(source):
def _parse_line(source):
if trailing(source, "\\") == 1:
source = source.rstrip("\\")
source += "\n"
@@ -91,29 +91,29 @@ def _parseLine(source):
def _tokenise(source):
tokens = []
currentBlock = Element
current_block = Element
for line in source.split("\n"):
if not line.strip():
# Void block
tokens.append(currentBlock)
currentBlock = Element()
tokens.append(current_block)
current_block = Element()
elif line.startswith("#") and leading(line.lstrip("#"), " ") == 1:
tokens.append(currentBlock)
tokens.append(current_block)
content = line.lstrip("#").strip()
currentBlock = Heading(content, leading(line, "#"))
current_block = Heading(content, leading(line, "#"))
else:
if not isinstance(currentBlock, Paragraph):
if not isinstance(current_block, Paragraph):
# Paragraph is default
tokens.append(currentBlock)
currentBlock = Paragraph("")
tokens.append(current_block)
current_block = Paragraph("")
currentBlock.addLine(line)
current_block.addLine(line)
tokens.append(currentBlock)
tokens.append(current_block)
return tokens
@@ -134,9 +134,9 @@ dolor sit amet
print(repr(i))
def parseMarkdown(source):
def parse_markdown(source):
tokens = _tokenise(source)
parseMarkdown("")
print(_parseLine("**bold** text"))
parse_markdown("")
print(_parse_line("**bold** text"))
models.py
@@ -26,70 +26,70 @@ __all__ = [
with app.app_context():
class RepoAccess(db.Model):
id = db.Column(db.Integer, primary_key=True)
userUsername = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
repoRoute = db.Column(db.String(98), db.ForeignKey("repo.route"), nullable=False)
accessLevel = db.Column(db.SmallInteger(), nullable=False) # 0 read-only, 1 read-write, 2 admin
user_username = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
repo_route = db.Column(db.String(98), db.ForeignKey("repo.route"), nullable=False)
access_level = db.Column(db.SmallInteger(), nullable=False) # 0 read-only, 1 read-write, 2 admin
user = db.relationship("User", back_populates="repoAccess")
repo = db.relationship("Repo", back_populates="repoAccess")
user = db.relationship("User", back_populates="repo_access")
repo = db.relationship("Repo", back_populates="repo_access")
__table_args__ = (db.UniqueConstraint("userUsername", "repoRoute", name="_user_repo_uc"),)
__table_args__ = (db.UniqueConstraint("user_username", "repo_route", name="_user_repo_uc"),)
def __init__(self, user, repo, level):
self.userUsername = user.username
self.repoRoute = repo.route
self.accessLevel = level
self.user_username = user.username
self.repo_route = repo.route
self.access_level = level
class RepoFavourite(db.Model):
id = db.Column(db.Integer, primary_key=True)
userUsername = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
repoRoute = db.Column(db.String(98), db.ForeignKey("repo.route"), nullable=False)
user_username = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
repo_route = db.Column(db.String(98), db.ForeignKey("repo.route"), nullable=False)
user = db.relationship("User", back_populates="favourites")
repo = db.relationship("Repo", back_populates="favourites")
__table_args__ = (db.UniqueConstraint("userUsername", "repoRoute", name="_user_repo_uc1"),)
__table_args__ = (db.UniqueConstraint("user_username", "repo_route", name="_user_repo_uc1"),)
def __init__(self, user, repo):
self.userUsername = user.username
self.repoRoute = repo.route
self.user_username = user.username
self.repo_route = repo.route
class PostVote(db.Model):
id = db.Column(db.Integer, primary_key=True)
userUsername = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
postIdentifier = db.Column(db.String(109), db.ForeignKey("post.identifier"), nullable=False)
voteScore = db.Column(db.SmallInteger(), nullable=False)
user_username = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
post_identifier = db.Column(db.String(109), db.ForeignKey("post.identifier"), nullable=False)
vote_score = db.Column(db.SmallInteger(), nullable=False)
user = db.relationship("User", back_populates="votes")
post = db.relationship("Post", back_populates="votes")
__table_args__ = (db.UniqueConstraint("userUsername", "postIdentifier", name="_user_post_uc"),)
__table_args__ = (db.UniqueConstraint("user_username", "post_identifier", name="_user_post_uc"),)
def __init__(self, user, post, score):
self.userUsername = user.username
self.postIdentifier = post.identifier
self.voteScore = score
self.user_username = user.username
self.post_identifier = post.identifier
self.vote_score = score
class User(db.Model):
username = db.Column(db.String(32), unique=True, nullable=False, primary_key=True)
displayName = db.Column(db.Unicode(128), unique=False, nullable=True)
display_name = db.Column(db.Unicode(128), unique=False, nullable=True)
bio = db.Column(db.Unicode(16384), unique=False, nullable=True)
passwordHashed = db.Column(db.String(60), nullable=False)
password_hashed = db.Column(db.String(60), nullable=False)
email = db.Column(db.String(254), nullable=True)
company = db.Column(db.Unicode(64), nullable=True)
companyURL = db.Column(db.String(256), nullable=True)
URL = db.Column(db.String(256), nullable=True)
showMail = db.Column(db.Boolean, default=False, nullable=False)
company_url = db.Column(db.String(256), nullable=True)
url = db.Column(db.String(256), nullable=True)
show_mail = db.Column(db.Boolean, default=False, nullable=False)
location = db.Column(db.Unicode(64), nullable=True)
creationDate = db.Column(db.DateTime, default=datetime.utcnow)
creation_date = db.Column(db.DateTime, default=datetime.utcnow)
repositories = db.relationship("Repo", back_populates="owner")
followers = db.relationship("UserFollow", back_populates="followed", foreign_keys="[UserFollow.followedUsername]")
follows = db.relationship("UserFollow", back_populates="follower", foreign_keys="[UserFollow.followerUsername]")
repoAccess = db.relationship("RepoAccess", back_populates="user")
followers = db.relationship("UserFollow", back_populates="followed", foreign_keys="[UserFollow.followed_username]")
follows = db.relationship("UserFollow", back_populates="follower", foreign_keys="[UserFollow.follower_username]")
repo_access = db.relationship("RepoAccess", back_populates="user")
votes = db.relationship("PostVote", back_populates="user")
favourites = db.relationship("RepoFavourite", back_populates="user")
@@ -97,11 +97,11 @@ with app.app_context():
posts = db.relationship("Post", back_populates="owner")
notifications = db.relationship("UserNotification", back_populates="user")
def __init__(self, username, password, email=None, displayName=None):
def __init__(self, username, password, email=None, display_name=None):
self.username = username
self.passwordHashed = bcrypt.generate_password_hash(password, config.HASHING_ROUNDS).decode("utf-8")
self.password_hashed = bcrypt.generate_password_hash(password, config.HASHING_ROUNDS).decode("utf-8")
self.email = email
self.displayName = displayName
self.display_name = display_name
# Create the user's directory
if not os.path.exists(os.path.join(config.REPOS_PATH, username)):
@@ -109,144 +109,144 @@ with app.app_context():
if not os.path.exists(os.path.join(config.USERDATA_PATH, username)):
os.makedirs(os.path.join(config.USERDATA_PATH, username))
avatarName = random.choice(os.listdir(config.DEFAULT_AVATARS_PATH))
if os.path.join(config.DEFAULT_AVATARS_PATH, avatarName).endswith(".svg"):
cairosvg.svg2png(url=os.path.join(config.DEFAULT_AVATARS_PATH, avatarName),
avatar_name = random.choice(os.listdir(config.DEFAULT_AVATARS_PATH))
if os.path.join(config.DEFAULT_AVATARS_PATH, avatar_name).endswith(".svg"):
cairosvg.svg2png(url=os.path.join(config.DEFAULT_AVATARS_PATH, avatar_name),
write_to="/tmp/roundabout-avatar.png")
avatar = Image.open("/tmp/roundabout-avatar.png")
else:
avatar = Image.open(os.path.join(config.DEFAULT_AVATARS_PATH, avatarName))
avatar = Image.open(os.path.join(config.DEFAULT_AVATARS_PATH, avatar_name))
avatar.thumbnail(config.AVATAR_SIZE)
avatar.save(os.path.join(config.USERDATA_PATH, username, "avatar.png"))
class Repo(db.Model):
route = db.Column(db.String(98), unique=True, nullable=False, primary_key=True)
ownerName = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
owner_name = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
name = db.Column(db.String(64), nullable=False)
owner = db.relationship("User", back_populates="repositories")
visibility = db.Column(db.SmallInteger(), nullable=False)
info = db.Column(db.Unicode(512), nullable=True)
URL = db.Column(db.String(256), nullable=True)
creationDate = db.Column(db.DateTime, default=datetime.utcnow)
url = db.Column(db.String(256), nullable=True)
creation_date = db.Column(db.DateTime, default=datetime.utcnow)
defaultBranch = db.Column(db.String(64), nullable=True, default="")
default_branch = db.Column(db.String(64), nullable=True, default="")
commits = db.relationship("Commit", back_populates="repo")
posts = db.relationship("Post", back_populates="repo")
repoAccess = db.relationship("RepoAccess", back_populates="repo")
repo_access = db.relationship("RepoAccess", back_populates="repo")
favourites = db.relationship("RepoFavourite", back_populates="repo")
lastPostID = db.Column(db.Integer, nullable=False, default=0)
last_post_id = db.Column(db.Integer, nullable=False, default=0)
def __init__(self, owner, name, visibility):
self.route = f"/{owner.username}/{name}"
self.name = name
self.ownerName = owner.username
self.owner_name = owner.username
self.owner = owner
self.visibility = visibility
# Add the owner as an admin
repoAccess = RepoAccess(owner, self, 2)
db.session.add(repoAccess)
repo_access = RepoAccess(owner, self, 2)
db.session.add(repo_access)
class Commit(db.Model):
identifier = db.Column(db.String(227), unique=True, nullable=False, primary_key=True)
sha = db.Column(db.String(128), nullable=False)
repoName = db.Column(db.String(98), db.ForeignKey("repo.route"), nullable=False)
ownerName = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
ownerIdentity = db.Column(db.String(321))
receiveDate = db.Column(db.DateTime, default=datetime.now)
authorDate = db.Column(db.DateTime)
repo_name = db.Column(db.String(98), db.ForeignKey("repo.route"), nullable=False)
owner_name = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
owner_identity = db.Column(db.String(321))
receive_date = db.Column(db.DateTime, default=datetime.now)
author_date = db.Column(db.DateTime)
message = db.Column(db.UnicodeText)
repo = db.relationship("Repo", back_populates="commits")
owner = db.relationship("User", back_populates="commits")
def __init__(self, sha, owner, repo, date, message, ownerIdentity):
def __init__(self, sha, owner, repo, date, message, owner_identity):
self.identifier = f"{repo.route}/{sha}"
self.sha = sha
self.repoName = repo.route
self.repo_name = repo.route
self.repo = repo
self.ownerName = owner.username
self.owner_name = owner.username
self.owner = owner
self.authorDate = datetime.fromtimestamp(int(date))
self.author_date = datetime.fromtimestamp(int(date))
self.message = message
self.ownerIdentity = ownerIdentity
self.owner_identity = owner_identity
class Post(db.Model):
identifier = db.Column(db.String(109), unique=True, nullable=False, primary_key=True)
number = db.Column(db.Integer, nullable=False)
repoName = db.Column(db.String(98), db.ForeignKey("repo.route"), nullable=False)
ownerName = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
repo_name = db.Column(db.String(98), db.ForeignKey("repo.route"), nullable=False)
owner_name = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
votes = db.relationship("PostVote", back_populates="post")
voteSum = db.Column(db.Integer, nullable=False, default=0)
vote_sum = db.Column(db.Integer, nullable=False, default=0)
parentID = db.Column(db.String(109), db.ForeignKey("post.identifier"), nullable=True)
parent_id = db.Column(db.String(109), db.ForeignKey("post.identifier"), nullable=True)
state = db.Column(db.SmallInteger, nullable=True, default=1)
date = db.Column(db.DateTime, default=datetime.now)
lastUpdated = db.Column(db.DateTime, default=datetime.now)
last_updated = db.Column(db.DateTime, default=datetime.now)
subject = db.Column(db.Unicode(384))
message = db.Column(db.UnicodeText)
repo = db.relationship("Repo", back_populates="posts")
owner = db.relationship("User", back_populates="posts")
parent = db.relationship("Post", back_populates="children", remote_side="Post.identifier")
children = db.relationship("Post", back_populates="parent", remote_side="Post.parentID")
children = db.relationship("Post", back_populates="parent", remote_side="Post.parent_id")
def __init__(self, owner, repo, parent, subject, message):
self.identifier = f"{repo.route}/{repo.lastPostID}"
self.number = repo.lastPostID
self.repoName = repo.route
self.identifier = f"{repo.route}/{repo.last_post_id}"
self.number = repo.last_post_id
self.repo_name = repo.route
self.repo = repo
self.ownerName = owner.username
self.owner_name = owner.username
self.owner = owner
self.subject = subject
self.message = message
self.parent = parent
repo.lastPostID += 1
repo.last_post_id += 1
def updateDate(self):
self.lastUpdated = datetime.now()
def update_date(self):
self.last_updated = datetime.now()
with db.session.no_autoflush:
if self.parent is not None:
self.parent.updateDate()
self.parent.update_date()
class UserNotification(db.Model):
id = db.Column(db.Integer, primary_key=True)
userUsername = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
notificationID = db.Column(db.BigInteger, db.ForeignKey("notification.id"))
attentionLevel = db.Column(db.SmallInteger, nullable=False) # 0 is read
readTime = db.Column(db.DateTime, nullable=True)
user_username = db.Column(db.String(32), db.ForeignKey("user.username"), nullable=False)
notification_id = db.Column(db.BigInteger, db.ForeignKey("notification.id"))
attention_level = db.Column(db.SmallInteger, nullable=False) # 0 is read
read_time = db.Column(db.DateTime, nullable=True)
user = db.relationship("User", back_populates="notifications")
notification = db.relationship("Notification", back_populates="notifications")
__table_args__ = (db.UniqueConstraint("userUsername", "notificationID", name="_user_notification_uc"),)
__table_args__ = (db.UniqueConstraint("user_username", "notification_id", name="_user_notification_uc"),)
def __init__(self, user, notification, level):
self.userUsername = user.username
self.notificationID = notification.id
self.attentionLevel = level
self.user_username = user.username
self.notification_id = notification.id
self.attention_level = level
def read(self):
self.readTime = datetime.utcnow
self.attentionLevel = 0
self.read_time = datetime.utcnow
self.attention_level = 0
class UserFollow(db.Model):
id = db.Column(db.Integer, primary_key=True)
followerUsername = db.Column(db.String(32), db.ForeignKey("user.username", ondelete="CASCADE"), nullable=False)
followedUsername = db.Column(db.String(32), db.ForeignKey("user.username", ondelete="CASCADE"), nullable=False)
follower_username = db.Column(db.String(32), db.ForeignKey("user.username", ondelete="CASCADE"), nullable=False)
followed_username = db.Column(db.String(32), db.ForeignKey("user.username", ondelete="CASCADE"), nullable=False)
follower = db.relationship("User", back_populates="follows", foreign_keys=[followedUsername])
followed = db.relationship("User", back_populates="followers", foreign_keys=[followerUsername])
follower = db.relationship("User", back_populates="follows", foreign_keys=[followed_username])
followed = db.relationship("User", back_populates="followers", foreign_keys=[follower_username])
def __init__(self, followerUsername, followedUsername):
self.followerUsername = followerUsername
self.followedUsername = followedUsername
def __init__(self, follower_username, followed_username):
self.follower_username = follower_username
self.followed_username = followed_username
class Notification(db.Model):
@@ -257,8 +257,3 @@ with app.app_context():
def __init__(self, json):
self.data = json
# def sendTo(self, users, level):
# for user in users:
# db.session.add(UserNotification(user, self, level))
templates/default.html
@@ -24,7 +24,7 @@
{% block breadcrumbs %}{% endblock %}
</ul>
<x-hbox style="--gap: 2ch;">
{% if loggedInUser %}
{% if logged_in_user %}
<a href="/newrepo">
<x-hbox style="gap: 0.75ch;" class="box-center">
<iconify-icon icon="mdi:folder-plus"></iconify-icon>
@@ -36,10 +36,10 @@
<iconify-icon icon="ic:baseline-inbox"></iconify-icon>
</x-hbox>
</a>
<a href="/{{ loggedInUser }}">
<a href="/{{ logged_in_user }}">
<x-hbox style="gap: 0.75ch;" class="box-center">
<img src="/info/{{ loggedInUser }}/avatar" class="avatar" style="width: 1em; height: 1em;">
{{ loggedInUser }}
<img src="/info/{{ logged_in_user }}/avatar" class="avatar" style="width: 1em; height: 1em;">
{{ logged_in_user }}
</x-hbox>
</a>
<a href="/logout">
templates/post.html
@@ -19,7 +19,7 @@
<p>
{{ post.message }}
</p>
{% if loggedInUser %}
{% if logged_in_user %}
<x-buttonbox class="box-center">
<button onclick="vote({{ post.number }}, 1);" class="button-flat big-button" id="{{ post.number }}-voteup"><iconify-icon icon="mdi:arrow-up"></iconify-icon></button>
<span style="font-size: 1.5em;" id="{{ post.number }}-vote">{{ post.voteSum }}</span>
@@ -30,7 +30,7 @@
</section>
</article>
</dt>
{% if loggedInUser %}
{% if logged_in_user %}
<dd>
<details>
<summary>Reply</summary>
@@ -51,7 +51,7 @@
</dd>
{% endif %}
{% set level = level + 1 %}
{% if level <= maxPostNesting %}
{% if level <= max_post_nesting %}
{% if post.children %}
{% for post in Post.query.filter_by(parent=post).order_by(Post.date) %}
<dd>{% include "post.html" %}</dd>
@@ -62,4 +62,4 @@
<a href="{{ post.number }}">Comments hidden; click to go deeper.</a>
</dd>
{% endif %}
</dl>
</dl>
templates/repo.html
@@ -40,9 +40,9 @@
<li><a href="/{{ username }}/{{ repository }}/settings">Settings</a></li>
</ul>
<x-buttonbox>
{% if loggedInUser %}
{% if logged_in_user %}
<a class="button" href="/{{ username }}/{{ repository }}/favourite">
{% if not isFavourite %}
{% if not is_favourite %}
<iconify-icon icon="mdi:star"></iconify-icon>
Favourite
{% else %}
templates/user-profile-overview.html
@@ -6,9 +6,9 @@
<img src="/info/{{ user.username }}/avatar" class="avatar" style="width: 128px; height: 128px;">
<x-vbox class="nopad">
{% if user.displayName and user.displayName != user.username %}
{% if user.display_name and user.display_name != user.username %}
<hgroup id="username">
<h1>{{ user.displayName }}</h1>
<h1>{{ user.display_name }}</h1>
<p>{{ user.username }}</p>
</hgroup>
{% else %}
@@ -20,15 +20,15 @@
{% if user.URL %}
<li><a href="{{ user.URL }}"><x-hbox><iconify-icon icon="ic:outline-web"></iconify-icon>{{ user.URL }}</x-hbox></a></li>
{% endif %}
{% if user.companyURL %}
<li><a href="{{ user.companyURL }}"><x-hbox><iconify-icon icon="ic:baseline-business-center"></iconify-icon>{{ user.company }}</x-hbox></a></li>
{% if user.company_url %}
<li><a href="{{ user.company_url }}"><x-hbox><iconify-icon icon="ic:baseline-business-center"></iconify-icon>{{ user.company }}</x-hbox></a></li>
{% elif user.company %}
<li><x-hbox><iconify-icon icon="ic:baseline-business-center"></iconify-icon>{{ user.company }}</x-hbox></li>
{% endif %}
{% if user.location %}
<li><x-hbox><iconify-icon icon="mdi:map-marker-radius"></iconify-icon>{{ user.location }}</x-hbox></li>
{% endif %}
{% if user.showMail %}
{% if user.show_mail %}
<li><a href="mailto:{{ user.email }}"><x-hbox><iconify-icon icon="mdi:email"></iconify-icon>{{ user.email }}</x-hbox></a></li>
{% endif %}
</ul>
templates/user-profile.html
@@ -14,7 +14,7 @@
<li><a href="?action=follows">Follows ({{ user.follows | length }})</a></li>
</ul>
<x-buttonbox>
{% if loggedInUser != user.username and loggedInUser %}
{% if logged_in_user != user.username and logged_in_user %}
<form action="?action=follow" method="POST">
<button type="submit">
<iconify-icon icon="mdi:eye"></iconify-icon>
templates/user-settings.html
@@ -11,7 +11,7 @@
<article class="card">
<section class="card-main">
<h2>Basic information</h2>
<p>Usermame: {{ user.username }}</p>
<p>Username: {{ user.username }}</p>
<p>Email address: {{ user.email }}</p>
<x-buttonbox>
<a class="button" href="password">Change password</a>
@@ -26,11 +26,11 @@
<x-vbox>
<x-vbox class="nopad">
<label for="displayname">Friendly name</label>
<input id="displayname" name="displayname" value="{% if user.displayName %}{{ user.displayName }}{% endif %}" placeholder="{{ user.username }}">
<input id="displayname" name="displayname" value="{% if user.display_name %}{{ user.display_name }}{% endif %}" placeholder="{{ user.username }}">
</x-vbox>
<x-vbox class="nopad">
<label for="url">Link to your website</label>
<input id="url" name="url" value="{% if user.URL %}{{ user.URL }}{% endif %}" type="url">
<input id="url" name="url" value="{% if user.url %}{{ user.url }}{% endif %}" type="url">
</x-vbox>
<x-vbox class="nopad">
<x-hbox style="width: 100%; align-items: space-between;">
@@ -40,12 +40,12 @@
</x-vbox>
<x-vbox style="flex-grow: 1;" class="nopad">
<label for="companyurl">Link to the company's website</label>
<input id="companyurl" name="companyurl" value="{% if user.companyURL %}{{ user.companyURL }}{% endif %}" type="url">
<input id="companyurl" name="companyurl" value="{% if user.company_url %}{{ user.company_url }}{% endif %}" type="url">
</x-vbox>
</x-hbox>
</x-vbox>
<x-vbox class="nopad">
<label><input name="showmail" value="showmail" {% if user.showMail %}checked{% endif %} type="checkbox">Show email on my profile</label>
<label><input name="showmail" value="showmail" {% if user.show_mail %}checked{% endif %} type="checkbox">Show email on my profile</label>
</x-vbox>
<x-vbox class="nopad">
<label for="location">Location</label>
@@ -61,4 +61,4 @@
</section>
</article>
</x-frame>
{% endblock %}
{% endblock %}