Merge branch 'master' into fix-seed-db
3
.gitignore
vendored
|
@ -1,5 +1,6 @@
|
|||
image.png
|
||||
image.gif
|
||||
dramacache/
|
||||
cache/
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
|
|
@ -2,12 +2,12 @@ version: 0.0
|
|||
os: linux
|
||||
files:
|
||||
- source: /
|
||||
destination: drama
|
||||
destination: files
|
||||
permissions:
|
||||
- object: drama/*
|
||||
- object: files/*
|
||||
mode: 4755
|
||||
hooks:
|
||||
AfterInstall:
|
||||
- location: scripts/install_pip
|
||||
ApplicationStart:
|
||||
- location: scripts/start_drama
|
||||
- location: scripts/start_files
|
|
@ -1,7 +1,7 @@
|
|||
for theme in ['midnight', 'dark', 'light', 'coffee', 'tron', '4chan']:
|
||||
with open(f"./drama/assets/style/{theme}_ff66ac.css", encoding='utf-8') as t:
|
||||
with open(f"./files/assets/style/{theme}_ff66ac.css", encoding='utf-8') as t:
|
||||
text = t.read()
|
||||
for color in ['ff66ac','805ad5','62ca56','38a169','80ffff','2a96f3','62ca56','eb4963','ff0000','f39731','30409f','3e98a7','e4432d','7b9ae4','ec72de','7f8fa6', 'f8db58']:
|
||||
newtext = text.replace("ff66ac", color).replace("ff4097", color).replace("ff1a83", color).replace("ff3390", color).replace("rgba(255, 102, 172, 0.25)", color)
|
||||
with open(f"./drama/assets/style/{theme}_{color}.css", encoding='utf-8', mode='w') as nt:
|
||||
with open(f"./files/assets/style/{theme}_{color}.css", encoding='utf-8', mode='w') as nt:
|
||||
nt.write(newtext)
|
|
@ -1,36 +1,43 @@
|
|||
version: '2.3'
|
||||
|
||||
services:
|
||||
drama:
|
||||
files:
|
||||
build:
|
||||
context: .
|
||||
volumes:
|
||||
- "./:/drama/service"
|
||||
- "./:/service"
|
||||
environment:
|
||||
- PYTHONPATH="drama/service"
|
||||
- PYTHONPATH="/service"
|
||||
- REDIS_URL=redis://redis
|
||||
- DATABASE_URL=postgresql://postgres@postgres:5432/postgres
|
||||
- DATABASE_CONNECTION_POOL_URL=postgresql://postgres@postgres:5432/postgres
|
||||
- MASTER_KEY=${MASTER_KEY:-KTVciAUQFpFh2WdJ/oiHJlxl6FvzRZp8kYzAAv3l2OA=}
|
||||
- domain=localhost
|
||||
- DOMAIN=localhost
|
||||
- SITE_NAME=Drama
|
||||
- CLOUDFLARE_ZONE=vcxvdfgfc6r554etrgd
|
||||
- CLOUDFLARE_KEY=vcxvdfgfc6r554etrgd
|
||||
- TENOR_KEY=vcxvdfgfc6r554etrgd
|
||||
- MAILGUN_KEY=vcxvdfgfc6r554etrgd
|
||||
- MAILGUN_DOMAIN=rdrama.net
|
||||
- admin_email=drama@rdrama.net
|
||||
- FORCE_HTTPS=0
|
||||
- DISCORD_SERVER_ID=vcxvdfgfc6r554etrgd
|
||||
- DISCORD_CLIENT_ID=vcxvdfgfc6r554etrgd
|
||||
- DISCORD_CLIENT_SECRET=vcxvdfgfc6r554etrgd
|
||||
- DISCORD_BOT_TOKEN=vcxvdfgfc6r554etrgd
|
||||
- imgurkey=vcxvdfgfc6r554etrgd
|
||||
- IMGUR_KEY=vcxvdfgfc6r554etrgd
|
||||
- FACEBOOK_TOKEN=vcxvdfgfc6r554etrgd
|
||||
#- HCAPTCHA_SITEKEY=vcxvdfgfc6r554etrgd
|
||||
#- HCAPTCHA_SITEKEY=vcxvdfgfc6r554etrgd
|
||||
- HCAPTCHA_SECRET=vcxvdfgfc6r554etrgd
|
||||
- youtubekey=vcxvdfgfc6r554etrgd
|
||||
- YOUTUBE_KEY=vcxvdfgfc6r554etrgd
|
||||
- PUSHER_KEY=vcxvdfgfc6r554etrgd
|
||||
- SPAM_SIMILARITY_THRESHOLD=0.5
|
||||
- SPAM_SIMILAR_COUNT_THRESHOLD=5
|
||||
- SPAM_URL_SIMILARITY_THRESHOLD=0.1
|
||||
- COMMENT_SPAM_SIMILAR_THRESHOLD=0.5
|
||||
- COMMENT_SPAM_COUNT_THRESHOLD=5
|
||||
- READ_ONLY=0
|
||||
- BOT_DISABLE=0
|
||||
- COINS_NAME=Dramacoins
|
||||
links:
|
||||
- "redis"
|
||||
- "postgres"
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
|
||||
from drama.__main__ import Base, app
|
|
@ -30,28 +30,15 @@ app = Flask(__name__,
|
|||
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=3)
|
||||
app.url_map.strict_slashes = False
|
||||
|
||||
app.config["SITE_NAME"]=environ.get("SITE_NAME", "Drama").strip()
|
||||
|
||||
app.config["SITE_COLOR"]=environ.get("SITE_COLOR", "805ad5").strip()
|
||||
|
||||
app.config["DRAMAPATH"]=environ.get("DRAMAPATH", path.dirname(path.realpath(__file__)))
|
||||
|
||||
app.config["SITE_NAME"]=environ.get("SITE_NAME").strip()
|
||||
app.config["COINS_NAME"]=environ.get("COINS_NAME").strip()
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||
app.config['DATABASE_URL'] = environ.get(
|
||||
"DATABASE_CONNECTION_POOL_URL",
|
||||
environ.get("DATABASE_URL"))
|
||||
|
||||
app.config['SQLALCHEMY_READ_URIS'] = [
|
||||
environ.get("DATABASE_CONNECTION_READ_01_URL"),
|
||||
environ.get("DATABASE_CONNECTION_READ_02_URL"),
|
||||
environ.get("DATABASE_CONNECTION_READ_03_URL")
|
||||
]
|
||||
app.config['DATABASE_URL'] = environ.get("DATABASE_CONNECTION_POOL_URL",environ.get("DATABASE_URL"))
|
||||
|
||||
app.config['SECRET_KEY'] = environ.get('MASTER_KEY')
|
||||
app.config["SERVER_NAME"] = environ.get("domain").strip()
|
||||
app.config["SERVER_NAME"] = environ.get("DOMAIN").strip()
|
||||
|
||||
app.config["SHORT_DOMAIN"]=environ.get("SHORT_DOMAIN","").strip()
|
||||
app.config["SESSION_COOKIE_NAME"] = "session_drama"
|
||||
app.config["SESSION_COOKIE_NAME"] = "session_" + environ.get("SITE_NAME").strip().lower()
|
||||
app.config["VERSION"] = "1.0.0"
|
||||
app.config['MAX_CONTENT_LENGTH'] = 64 * 1024 * 1024
|
||||
app.config["SESSION_COOKIE_SECURE"] = bool(int(environ.get("FORCE_HTTPS", 1)))
|
||||
|
@ -61,7 +48,6 @@ app.config["PERMANENT_SESSION_LIFETIME"] = 60 * 60 * 24 * 365
|
|||
app.config["SESSION_REFRESH_EACH_REQUEST"] = True
|
||||
|
||||
app.config["FORCE_HTTPS"] = int(environ.get("FORCE_HTTPS", 1)) if ("localhost" not in app.config["SERVER_NAME"] and "127.0.0.1" not in app.config["SERVER_NAME"]) else 0
|
||||
app.config["DISABLE_SIGNUPS"]=int(environ.get("DISABLE_SIGNUPS",0))
|
||||
|
||||
app.jinja_env.cache = {}
|
||||
|
||||
|
@ -70,34 +56,26 @@ app.config["UserAgent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
|
|||
if "localhost" in app.config["SERVER_NAME"]:
|
||||
app.config["CACHE_TYPE"] = "null"
|
||||
else:
|
||||
app.config["CACHE_TYPE"] = environ.get("CACHE_TYPE", 'filesystem').strip()
|
||||
app.config["CACHE_TYPE"] = "filesystem"
|
||||
|
||||
app.config["CACHE_DIR"] = environ.get("CACHE_DIR", "dramacache")
|
||||
app.config["CACHE_DIR"] = environ.get("CACHE_DIR", "cache")
|
||||
|
||||
# captcha configs
|
||||
app.config["HCAPTCHA_SITEKEY"] = environ.get("HCAPTCHA_SITEKEY","").strip()
|
||||
app.config["HCAPTCHA_SECRET"] = environ.get(
|
||||
"HCAPTCHA_SECRET","").strip()
|
||||
app.config["SIGNUP_HOURLY_LIMIT"]=int(environ.get("SIGNUP_HOURLY_LIMIT",0))
|
||||
app.config["HCAPTCHA_SECRET"] = environ.get("HCAPTCHA_SECRET","").strip()
|
||||
|
||||
# antispam configs
|
||||
app.config["SPAM_SIMILARITY_THRESHOLD"] = float(
|
||||
environ.get("SPAM_SIMILARITY_THRESHOLD", 0.5))
|
||||
app.config["SPAM_SIMILAR_COUNT_THRESHOLD"] = int(
|
||||
environ.get("SPAM_SIMILAR_COUNT_THRESHOLD", 5))
|
||||
app.config["SPAM_URL_SIMILARITY_THRESHOLD"] = float(
|
||||
environ.get("SPAM_URL_SIMILARITY_THRESHOLD", 0.1))
|
||||
app.config["COMMENT_SPAM_SIMILAR_THRESHOLD"] = float(
|
||||
environ.get("COMMENT_SPAM_SIMILAR_THRESHOLD", 0.5))
|
||||
app.config["COMMENT_SPAM_COUNT_THRESHOLD"] = int(
|
||||
environ.get("COMMENT_SPAM_COUNT_THRESHOLD", 5))
|
||||
app.config["SPAM_SIMILARITY_THRESHOLD"] = float(environ.get("SPAM_SIMILARITY_THRESHOLD"))
|
||||
app.config["SPAM_SIMILAR_COUNT_THRESHOLD"] = int(environ.get("SPAM_SIMILAR_COUNT_THRESHOLD"))
|
||||
app.config["SPAM_URL_SIMILARITY_THRESHOLD"] = float(environ.get("SPAM_URL_SIMILARITY_THRESHOLD"))
|
||||
app.config["COMMENT_SPAM_SIMILAR_THRESHOLD"] = float(environ.get("COMMENT_SPAM_SIMILAR_THRESHOLD"))
|
||||
app.config["COMMENT_SPAM_COUNT_THRESHOLD"] = int(environ.get("COMMENT_SPAM_COUNT_THRESHOLD"))
|
||||
|
||||
app.config["CACHE_REDIS_URL"] = environ.get(
|
||||
"REDIS_URL").strip().lstrip() if environ.get("REDIS_URL") else None
|
||||
app.config["CACHE_REDIS_URL"] = environ.get("REDIS_URL").strip()
|
||||
app.config["CACHE_DEFAULT_TIMEOUT"] = 60
|
||||
app.config["CACHE_KEY_PREFIX"] = "flask_caching_"
|
||||
|
||||
app.config["REDIS_POOL_SIZE"]=int(environ.get("REDIS_POOL_SIZE", 10))
|
||||
app.config["REDIS_POOL_SIZE"] = 10
|
||||
|
||||
redispool=ConnectionPool(
|
||||
max_connections=app.config["REDIS_POOL_SIZE"],
|
||||
|
@ -105,7 +83,7 @@ redispool=ConnectionPool(
|
|||
) if app.config["CACHE_TYPE"]=="redis" else None
|
||||
app.config["CACHE_OPTIONS"]={'connection_pool':redispool} if app.config["CACHE_TYPE"]=="redis" else {}
|
||||
|
||||
app.config["READ_ONLY"]=bool(int(environ.get("READ_ONLY", False)))
|
||||
app.config["READ_ONLY"]=bool(int(environ.get("READ_ONLY")))
|
||||
app.config["BOT_DISABLE"]=bool(int(environ.get("BOT_DISABLE", False)))
|
||||
|
||||
app.config["TENOR_KEY"]=environ.get("TENOR_KEY",'').strip()
|
||||
|
@ -115,18 +93,15 @@ Markdown(app)
|
|||
cache = Cache(app)
|
||||
Compress(app)
|
||||
|
||||
app.config["RATELIMIT_STORAGE_URL"] = environ.get("REDIS_URL").strip() if environ.get("REDIS_URL") else 'memory://'
|
||||
app.config["RATELIMIT_STORAGE_URL"] = environ.get("REDIS_URL").strip()
|
||||
app.config["RATELIMIT_KEY_PREFIX"] = "flask_limiting_"
|
||||
app.config["RATELIMIT_ENABLED"] = True
|
||||
app.config["RATELIMIT_DEFAULTS_DEDUCT_WHEN"]=lambda:True
|
||||
app.config["RATELIMIT_DEFAULTS_EXEMPT_WHEN"]=lambda:False
|
||||
app.config["RATELIMIT_HEADERS_ENABLED"]=True
|
||||
|
||||
#app.config["DISABLESIGNUPS"] = bool(int(environ.get("DISABLESIGNUPS", "0")))
|
||||
|
||||
|
||||
def limiter_key_func():
|
||||
return request.remote_addr
|
||||
def limiter_key_func(): return request.remote_addr
|
||||
|
||||
|
||||
limiter = Limiter(
|
||||
|
@ -196,9 +171,9 @@ UA_BAN_CACHE_TTL = int(environ.get("UA_BAN_CACHE_TTL", 3600))
|
|||
|
||||
|
||||
# import and bind all routing functions
|
||||
import drama.classes
|
||||
from drama.routes import *
|
||||
import drama.helpers.jinja2
|
||||
import files.classes
|
||||
from files.routes import *
|
||||
import files.helpers.jinja2
|
||||
|
||||
@cache.memoize(UA_BAN_CACHE_TTL)
|
||||
def get_useragent_ban_response(user_agent_str):
|
||||
|
@ -210,8 +185,8 @@ def get_useragent_ban_response(user_agent_str):
|
|||
# return False, (None, None)
|
||||
|
||||
result = g.db.query(
|
||||
drama.classes.Agent).filter(
|
||||
drama.classes.Agent.kwd.in_(
|
||||
files.classes.Agent).filter(
|
||||
files.classes.Agent.kwd.in_(
|
||||
user_agent_str.split())).first()
|
||||
if result:
|
||||
return True, (result.mock or "Follow the robots.txt, dumbass",
|
||||
|
@ -267,26 +242,6 @@ def before_request():
|
|||
else:
|
||||
g.system="other/other"
|
||||
|
||||
|
||||
def log_event(name, link):
|
||||
|
||||
x = requests.get(link)
|
||||
|
||||
if x.status_code != 200:
|
||||
return
|
||||
|
||||
text = f'> **{name}**\r> {link}'
|
||||
|
||||
url = environ.get("DISCORD_WEBHOOK")
|
||||
headers = {"Content-Type": "application/json"}
|
||||
data = {"username": "drama",
|
||||
"content": text
|
||||
}
|
||||
|
||||
x = requests.post(url, headers=headers, json=data)
|
||||
print(x.status_code)
|
||||
|
||||
|
||||
@app.after_request
|
||||
def after_request(response):
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
BIN
files/assets/images/badges/retarded.png
Normal file
After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 91 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 5 KiB |
Before Width: | Height: | Size: 6 KiB After Width: | Height: | Size: 6 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 944 B After Width: | Height: | Size: 944 B |
Before Width: | Height: | Size: 206 B After Width: | Height: | Size: 206 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 5 KiB |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |