Compare commits
20 Commits
2018-11-09
...
master
Author | SHA1 | Date | |
---|---|---|---|
7a8b53474d | |||
528d8b7a58 | |||
0f0f74a3e5 | |||
0cc8f9e7a4 | |||
4732886317 | |||
2bf2651cee | |||
aafa748f92 | |||
39f571f788 | |||
108f0dad1a | |||
63de1f5ab5 | |||
642aec419a | |||
caf6e24d04 | |||
31a938693a | |||
45c89704f0 | |||
8d3a0e92de | |||
db78e3dcdb | |||
da1deecb4c | |||
df30ce9477 | |||
b2defa0eec | |||
4880b5c0c3 |
10
.github/workflows/luacheck.yml
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
name: luacheck
|
||||
on: [push, pull_request]
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
- uses: Roang-zero1/factorio-mod-luacheck@master
|
||||
with:
|
||||
luacheckrc_url: ""
|
11
.luacheckrc
Normal file
@ -0,0 +1,11 @@
|
||||
unused_args = false
|
||||
|
||||
read_globals = {
|
||||
table = {fields = {"copy"}},
|
||||
"minetest",
|
||||
"digilines"
|
||||
}
|
||||
|
||||
globals = {
|
||||
"led_marquee"
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
default
|
||||
digilines
|
||||
mesecons_luacontroller
|
||||
mesecons_microcontroller?
|
||||
mesecons_lamp?
|
@ -1 +0,0 @@
|
||||
This mod provides a simple LED marquee that accepts single characters, strings, and special control words via digilines.
|
125
init.lua
@ -2,13 +2,17 @@
|
||||
-- by Vanessa Dannenberg
|
||||
|
||||
led_marquee = {}
|
||||
led_marquee.scheduled_messages = {}
|
||||
|
||||
local S
|
||||
if minetest.get_modpath("intllib") then
|
||||
S = intllib.make_gettext_pair()
|
||||
else
|
||||
S = function(s) return s end
|
||||
end
|
||||
-- settings
|
||||
led_marquee.message_minimum_time = tonumber(minetest.settings:get("led_marquee_message_minimum_time")) or 0.5
|
||||
led_marquee.message_schedule_dtime = tonumber(minetest.settings:get("led_marquee_message_schedule_dtime")) or 0.2
|
||||
led_marquee.message_schedule_size = tonumber(minetest.settings:get("led_marquee_message_schedule_size")) or 10
|
||||
|
||||
led_marquee.relay_timer = 0
|
||||
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
local FS = function(...) return minetest.formspec_escape(S(...)) end
|
||||
|
||||
local color_to_char = {
|
||||
"0",
|
||||
@ -96,24 +100,15 @@ local char_to_color = {
|
||||
-- the following functions based on the so-named ones in Jeija's digilines mod
|
||||
|
||||
local reset_meta = function(pos)
|
||||
minetest.get_meta(pos):set_string("formspec", "field[channel;Channel;${channel}]")
|
||||
end
|
||||
|
||||
local on_digiline_receive_std = function(pos, node, channel, msg)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local setchan = meta:get_string("channel")
|
||||
if setchan ~= channel then return end
|
||||
local num = tonumber(msg)
|
||||
if msg == "colon" or msg == "period" or msg == "off" or (num and (num >= 0 and num <= 9)) then
|
||||
minetest.swap_node(pos, { name = "led_marquee:marquee_"..msg, param2 = node.param2})
|
||||
end
|
||||
minetest.get_meta(pos):set_string("formspec",
|
||||
"formspec_version[4]"..
|
||||
"size[8,4]"..
|
||||
"button_exit[3,2.5;2,0.5;proceed;"..FS("Proceed").."]"..
|
||||
"field[1.75,1.5;4.5,0.5;channel;"..FS("Channel")..";${channel}]"
|
||||
)
|
||||
end
|
||||
|
||||
-- convert Lua's idea of a UTF-8 char to ISO-8859-1
|
||||
|
||||
-- first char is non-break space, 0xA0
|
||||
local iso_chars=" ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"
|
||||
|
||||
local get_iso = function(c)
|
||||
local hb = string.byte(c,1) or 0
|
||||
local lb = string.byte(c,2) or 0
|
||||
@ -128,7 +123,12 @@ local make_iso = function(s)
|
||||
local s2 = ""
|
||||
while i <= string.len(s) do
|
||||
if string.byte(s,i) > 159 then
|
||||
s2 = s2..string.char(get_iso(string.sub(s, i, i+1)))
|
||||
local ciso = get_iso(string.sub(s, i, i+1))
|
||||
if ciso >= 0 and ciso < 256 then
|
||||
s2 = s2..string.char(ciso)
|
||||
else
|
||||
s2 = s2..string.char(127)
|
||||
end
|
||||
i = i + 2
|
||||
else
|
||||
s2 = s2..string.sub(s, i, i)
|
||||
@ -143,7 +143,7 @@ end
|
||||
led_marquee.set_timer = function(pos, timeout)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:stop()
|
||||
if not timeout or timeout < 0.2 or timeout > 5 then return false end
|
||||
if not timeout or timeout < led_marquee.message_minimum_time or timeout > 5 then return false end
|
||||
|
||||
if timeout > 0 then
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -184,7 +184,7 @@ led_marquee.scroll_text = function(pos, elapsed, skip)
|
||||
break
|
||||
end
|
||||
end
|
||||
led_marquee.display_msg(pos, channel, "/"..colorchar..string.sub(msg, f)..string.rep(" ", skip + 1))
|
||||
led_marquee.schedule_msg(pos, channel, "/"..colorchar..string.sub(msg, f)..string.rep(" ", skip + 1))
|
||||
|
||||
meta:set_int("index", f)
|
||||
if not elapsed or elapsed < 0.2 then return false end
|
||||
@ -213,6 +213,27 @@ led_marquee.decode_color = function(msg)
|
||||
|
||||
end
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
if dtime <= led_marquee.message_schedule_dtime
|
||||
and (#led_marquee.scheduled_messages) > 0 then
|
||||
led_marquee.display_msg(
|
||||
led_marquee.scheduled_messages[1].pos,
|
||||
led_marquee.scheduled_messages[1].channel,
|
||||
led_marquee.scheduled_messages[1].msg
|
||||
)
|
||||
end
|
||||
table.remove(led_marquee.scheduled_messages, 1)
|
||||
end)
|
||||
|
||||
led_marquee.schedule_msg = function(pos, channel, msg)
|
||||
local idx = #led_marquee.scheduled_messages
|
||||
led_marquee.scheduled_messages[idx+1] = { pos=pos, channel=channel, msg=msg }
|
||||
|
||||
if idx >= led_marquee.message_schedule_size then
|
||||
table.remove(led_marquee.scheduled_messages, 1)
|
||||
end
|
||||
end
|
||||
|
||||
led_marquee.display_msg = function(pos, channel, msg)
|
||||
msg = string.sub(msg, 1, 6144).." "
|
||||
if string.sub(msg,1,1) == string.char(255) then -- treat it as incoming UTF-8
|
||||
@ -312,13 +333,13 @@ local on_digiline_receive_string = function(pos, node, channel, msg)
|
||||
led_marquee.set_timer(pos, 0)
|
||||
msg = string.rep(" ", 2048)
|
||||
meta:set_string("last_msg", msg)
|
||||
led_marquee.display_msg(pos, channel, msg)
|
||||
led_marquee.schedule_msg(pos, channel, msg)
|
||||
meta:set_int("index", 1)
|
||||
elseif msg == "allon" then
|
||||
led_marquee.set_timer(pos, 0)
|
||||
msg = string.rep(string.char(144), 2048)
|
||||
meta:set_string("last_msg", msg)
|
||||
led_marquee.display_msg(pos, channel, msg)
|
||||
led_marquee.schedule_msg(pos, channel, msg)
|
||||
meta:set_int("index", 1)
|
||||
elseif msg == "start_scroll" then
|
||||
local timeout = meta:get_int("timeout")
|
||||
@ -327,30 +348,31 @@ local on_digiline_receive_string = function(pos, node, channel, msg)
|
||||
led_marquee.set_timer(pos, 0)
|
||||
return
|
||||
elseif string.sub(msg, 1, 12) == "scroll_speed" then
|
||||
local timeout = tonumber(string.sub(msg, 13))
|
||||
led_marquee.set_timer(pos, timeout)
|
||||
local timeout = tonumber(string.sub(msg, 13)) or 0
|
||||
led_marquee.set_timer(pos, math.max(timeout, led_marquee.message_minimum_time))
|
||||
elseif string.sub(msg, 1, 11) == "scroll_step" then
|
||||
local skip = tonumber(string.sub(msg, 12))
|
||||
led_marquee.scroll_text(pos, nil, skip)
|
||||
elseif msg == "get" then -- get the master panel's displayed char as ASCII numerical value
|
||||
digilines.receptor_send(pos, digiline.rules.default, channel, tonumber(string.match(minetest.get_node(pos).name,"led_marquee:char_(.+)"))) -- wonderfully horrible string manipulaiton
|
||||
digilines.receptor_send(pos, digilines.rules.default, channel,
|
||||
tonumber(string.match(minetest.get_node(pos).name,"led_marquee:char_(.+)")))
|
||||
elseif msg == "getstr" then -- get the last stored message
|
||||
digilines.receptor_send(pos, digiline.rules.default, channel, meta:get_string("last_msg"))
|
||||
digilines.receptor_send(pos, digilines.rules.default, channel, meta:get_string("last_msg"))
|
||||
elseif msg == "getindex" then -- get the scroll index
|
||||
digilines.receptor_send(pos, digiline.rules.default, channel, meta:get_int("index"))
|
||||
digilines.receptor_send(pos, digilines.rules.default, channel, meta:get_int("index"))
|
||||
else
|
||||
msg = string.gsub(msg, "//", string.char(30))
|
||||
led_marquee.set_timer(pos, 0)
|
||||
local last_msg = meta:get_string("last_msg")
|
||||
meta:set_string("last_msg", msg)
|
||||
led_marquee.display_msg(pos, channel, msg)
|
||||
led_marquee.schedule_msg(pos, channel, msg)
|
||||
if last_msg ~= msg then
|
||||
meta:set_int("index", 1)
|
||||
end
|
||||
end
|
||||
else
|
||||
local asc = string.byte(msg)
|
||||
if asc > 29 and asc < 256 then
|
||||
if asc > 30 and asc < 256 then
|
||||
minetest.swap_node(pos, { name = "led_marquee:char_"..asc, param2 = fdir + (last_color*8)})
|
||||
meta:set_string("last_msg", tostring(msg))
|
||||
meta:set_int("index", 1)
|
||||
@ -358,7 +380,7 @@ local on_digiline_receive_string = function(pos, node, channel, msg)
|
||||
end
|
||||
elseif msg and type(msg) == "number" then
|
||||
meta:set_string("last_msg", tostring(msg))
|
||||
led_marquee.display_msg(pos, channel, tostring(msg))
|
||||
led_marquee.schedule_msg(pos, channel, tostring(msg))
|
||||
meta:set_int("index", 1)
|
||||
end
|
||||
end
|
||||
@ -367,25 +389,19 @@ end
|
||||
|
||||
for i = 31, 255 do
|
||||
local groups = { cracky = 2, not_in_creative_inventory = 1}
|
||||
local light = LIGHT_MAX-2
|
||||
local description = S("LED marquee panel ("..i..")")
|
||||
local tiles = {
|
||||
{ name="led_marquee_base.png", color="white"},
|
||||
{ name="led_marquee_leds_off.png", color="white"},
|
||||
"led_marquee_char_"..i..".png",
|
||||
}
|
||||
local light = minetest.LIGHT_MAX-2
|
||||
local description = S("LED marquee panel (@1)", i)
|
||||
local leds = "led_marquee_char_"..i..".png^[mask:led_marquee_leds_on.png"
|
||||
|
||||
if i == 31 then
|
||||
tiles = {
|
||||
{ name="led_marquee_base.png", color="white"},
|
||||
{ name="led_marquee_leds_off.png", color="white"},
|
||||
{
|
||||
name = "led_marquee_char_31.png",
|
||||
animation = {type = "vertical_frames", aspect_w = 32, aspect_h = 32, length = 0.75}
|
||||
}
|
||||
leds ={
|
||||
name = "led_marquee_char_31.png^[mask:led_marquee_leds_on_cursor.png",
|
||||
animation = {type = "vertical_frames", aspect_w = 32, aspect_h = 32, length = 0.75}
|
||||
}
|
||||
end
|
||||
|
||||
local wimage
|
||||
|
||||
if i == 32 then
|
||||
groups = {cracky = 2}
|
||||
light = nil
|
||||
@ -397,11 +413,15 @@ for i = 31, 255 do
|
||||
description = description,
|
||||
drawtype = "mesh",
|
||||
mesh = "led_marquee.obj",
|
||||
tiles = tiles,
|
||||
tiles = {
|
||||
{ name = "led_marquee_base.png", color = "white" },
|
||||
{ name = "led_marquee_leds_off.png", color = "white" }
|
||||
},
|
||||
overlay_tiles = { "", leds },
|
||||
inventory_image = wimage,
|
||||
is_ground_content = false,
|
||||
wield_image = wimage,
|
||||
palette="led_marquee_palette.png",
|
||||
use_texture_alpha = true,
|
||||
groups = groups,
|
||||
paramtype = "light",
|
||||
paramtype2 = "colorwallmounted",
|
||||
@ -412,6 +432,11 @@ for i = 31, 255 do
|
||||
reset_meta(pos)
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
local name = sender:get_player_name()
|
||||
if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, {protection_bypass=true}) then
|
||||
minetest.record_protection_violation(pos, name)
|
||||
return
|
||||
end
|
||||
if (fields.channel) then
|
||||
minetest.get_meta(pos):set_string("channel", fields.channel)
|
||||
end
|
||||
|
5
locale/led_marquee.de.tr
Normal file
@ -0,0 +1,5 @@
|
||||
# textdomain: led_marquee
|
||||
LED marquee panel (@1)=LED-Anzeigetafel (@1)
|
||||
LED marquee panel=LED-Anzeigetafel
|
||||
Proceed=Fortsetzen
|
||||
Channel=Kanal
|
5
locale/template.txt
Normal file
@ -0,0 +1,5 @@
|
||||
# textdomain: led_marquee
|
||||
LED marquee panel (@1)=
|
||||
LED marquee panel=
|
||||
Proceed=
|
||||
Channel=
|
5
mod.conf
@ -1 +1,6 @@
|
||||
name = led_marquee
|
||||
title = LED marquee
|
||||
description = This mod provides a simple LED marquee that accepts single characters, strings, and special control words via digilines.
|
||||
depends = default, digilines
|
||||
optional_depends = mesecons_luacontroller, mesecons_microcontroller, mesecons_lamp
|
||||
min_minetest_version = 5.2.0
|
||||
|
@ -21,10 +21,6 @@ v -0.500000 -0.453125 0.468750
|
||||
v -0.500000 -0.453125 -0.468750
|
||||
v -0.500000 -0.437500 -0.484375
|
||||
v -0.500000 -0.437500 -0.500000
|
||||
v 0.500000 -0.449125 -0.468750
|
||||
v -0.500000 -0.449125 -0.468750
|
||||
v -0.500000 -0.449125 0.468750
|
||||
v 0.500000 -0.449125 0.468750
|
||||
vt 0.681855 0.961799
|
||||
vt 0.723891 0.992824
|
||||
vt 0.723891 0.000000
|
||||
@ -69,10 +65,6 @@ vt 0.000000 0.000000
|
||||
vt 1.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 1.000000
|
||||
vt 0.000000 0.000000
|
||||
vt 1.000000 0.000000
|
||||
vt 1.000000 1.000000
|
||||
vt 0.000000 1.000000
|
||||
vn 1.0000 0.0000 0.0000
|
||||
vn 0.0000 -1.0000 -0.0000
|
||||
vn -1.0000 0.0000 0.0000
|
||||
@ -106,7 +98,5 @@ f 7/26/8 6/38/8 19/19/8
|
||||
f 19/19/6 6/38/6 5/20/6
|
||||
f 15/22/6 10/39/6 9/23/6
|
||||
f 8/25/7 17/40/7 16/24/7
|
||||
g Cube_Cube_LEDs_Cube_Cube_LEDs_leds_off
|
||||
g Cube_Cube_LEDs_Cube_Cube_LEDs_base_led_marquee_leds_off.png
|
||||
f 1/41/6 2/42/6 3/43/6 4/44/6
|
||||
g Cube_Cube_LEDs_Cube_Cube_LEDs_leds_on
|
||||
f 21/45/6 22/46/6 23/47/6 24/48/6
|
||||
|
Before Width: | Height: | Size: 649 KiB After Width: | Height: | Size: 649 KiB |
Before Width: | Height: | Size: 649 KiB |
8
settingtypes.txt
Normal file
@ -0,0 +1,8 @@
|
||||
# Minimal marquee interval
|
||||
led_marquee_message_minimum_time (Minimal marquee interval) float 0.5
|
||||
|
||||
# Marquee globalstep update interval
|
||||
led_marquee_message_schedule_dtime (Marquee globalstep update interval) float 0.2
|
||||
|
||||
# Global message queue size
|
||||
led_marquee_message_schedule_size (Global message queue size) int 10
|
Before Width: | Height: | Size: 419 B After Width: | Height: | Size: 208 B |
Before Width: | Height: | Size: 460 B After Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 495 B After Width: | Height: | Size: 94 B |
Before Width: | Height: | Size: 485 B After Width: | Height: | Size: 98 B |
Before Width: | Height: | Size: 493 B After Width: | Height: | Size: 92 B |
Before Width: | Height: | Size: 437 B After Width: | Height: | Size: 86 B |
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 90 B |
Before Width: | Height: | Size: 451 B After Width: | Height: | Size: 88 B |
Before Width: | Height: | Size: 298 B After Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 420 B After Width: | Height: | Size: 85 B |
Before Width: | Height: | Size: 594 B After Width: | Height: | Size: 91 B |
Before Width: | Height: | Size: 424 B After Width: | Height: | Size: 82 B |
Before Width: | Height: | Size: 429 B After Width: | Height: | Size: 85 B |
Before Width: | Height: | Size: 472 B After Width: | Height: | Size: 87 B |
Before Width: | Height: | Size: 492 B After Width: | Height: | Size: 91 B |
Before Width: | Height: | Size: 441 B After Width: | Height: | Size: 84 B |
Before Width: | Height: | Size: 450 B After Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 454 B After Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 416 B After Width: | Height: | Size: 81 B |
Before Width: | Height: | Size: 460 B After Width: | Height: | Size: 87 B |
Before Width: | Height: | Size: 486 B After Width: | Height: | Size: 93 B |
Before Width: | Height: | Size: 473 B After Width: | Height: | Size: 93 B |
Before Width: | Height: | Size: 344 B After Width: | Height: | Size: 86 B |
Before Width: | Height: | Size: 453 B After Width: | Height: | Size: 86 B |
Before Width: | Height: | Size: 445 B After Width: | Height: | Size: 88 B |
Before Width: | Height: | Size: 371 B After Width: | Height: | Size: 79 B |
Before Width: | Height: | Size: 447 B After Width: | Height: | Size: 88 B |
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 81 B |
Before Width: | Height: | Size: 568 B After Width: | Height: | Size: 93 B |
Before Width: | Height: | Size: 348 B After Width: | Height: | Size: 94 B |
Before Width: | Height: | Size: 338 B After Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 76 B |
Before Width: | Height: | Size: 279 B After Width: | Height: | Size: 79 B |
Before Width: | Height: | Size: 262 B After Width: | Height: | Size: 78 B |
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 78 B |
Before Width: | Height: | Size: 276 B After Width: | Height: | Size: 83 B |
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 84 B |
Before Width: | Height: | Size: 302 B After Width: | Height: | Size: 83 B |
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 81 B |
Before Width: | Height: | Size: 451 B After Width: | Height: | Size: 84 B |
Before Width: | Height: | Size: 272 B After Width: | Height: | Size: 83 B |
Before Width: | Height: | Size: 306 B After Width: | Height: | Size: 84 B |
Before Width: | Height: | Size: 305 B After Width: | Height: | Size: 84 B |
Before Width: | Height: | Size: 302 B After Width: | Height: | Size: 81 B |
Before Width: | Height: | Size: 342 B After Width: | Height: | Size: 84 B |
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 75 B |
Before Width: | Height: | Size: 336 B After Width: | Height: | Size: 95 B |
Before Width: | Height: | Size: 318 B After Width: | Height: | Size: 92 B |
Before Width: | Height: | Size: 314 B After Width: | Height: | Size: 88 B |
Before Width: | Height: | Size: 309 B After Width: | Height: | Size: 88 B |
Before Width: | Height: | Size: 323 B After Width: | Height: | Size: 91 B |
Before Width: | Height: | Size: 316 B After Width: | Height: | Size: 90 B |
Before Width: | Height: | Size: 359 B After Width: | Height: | Size: 96 B |
Before Width: | Height: | Size: 352 B After Width: | Height: | Size: 95 B |
Before Width: | Height: | Size: 244 B After Width: | Height: | Size: 83 B |
Before Width: | Height: | Size: 325 B After Width: | Height: | Size: 95 B |
Before Width: | Height: | Size: 362 B After Width: | Height: | Size: 102 B |
Before Width: | Height: | Size: 379 B After Width: | Height: | Size: 99 B |
Before Width: | Height: | Size: 494 B After Width: | Height: | Size: 102 B |
Before Width: | Height: | Size: 518 B After Width: | Height: | Size: 105 B |
Before Width: | Height: | Size: 500 B After Width: | Height: | Size: 101 B |
Before Width: | Height: | Size: 96 B After Width: | Height: | Size: 71 B |
Before Width: | Height: | Size: 336 B After Width: | Height: | Size: 88 B |
Before Width: | Height: | Size: 367 B After Width: | Height: | Size: 95 B |
Before Width: | Height: | Size: 399 B After Width: | Height: | Size: 102 B |
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 88 B |
Before Width: | Height: | Size: 332 B After Width: | Height: | Size: 91 B |
Before Width: | Height: | Size: 266 B After Width: | Height: | Size: 82 B |
Before Width: | Height: | Size: 396 B After Width: | Height: | Size: 97 B |
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 77 B |
Before Width: | Height: | Size: 438 B After Width: | Height: | Size: 101 B |
Before Width: | Height: | Size: 363 B After Width: | Height: | Size: 93 B |
Before Width: | Height: | Size: 293 B After Width: | Height: | Size: 83 B |
Before Width: | Height: | Size: 230 B After Width: | Height: | Size: 81 B |
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 77 B |
Before Width: | Height: | Size: 461 B After Width: | Height: | Size: 101 B |
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 79 B |
Before Width: | Height: | Size: 280 B After Width: | Height: | Size: 88 B |
Before Width: | Height: | Size: 297 B After Width: | Height: | Size: 91 B |
Before Width: | Height: | Size: 319 B After Width: | Height: | Size: 90 B |
Before Width: | Height: | Size: 291 B After Width: | Height: | Size: 90 B |
Before Width: | Height: | Size: 250 B After Width: | Height: | Size: 82 B |
Before Width: | Height: | Size: 307 B After Width: | Height: | Size: 85 B |
Before Width: | Height: | Size: 343 B After Width: | Height: | Size: 85 B |
Before Width: | Height: | Size: 216 B After Width: | Height: | Size: 76 B |
Before Width: | Height: | Size: 227 B After Width: | Height: | Size: 78 B |
Before Width: | Height: | Size: 304 B After Width: | Height: | Size: 90 B |