Merge branch 'master' of https://github.com/savetheinternet/Tinyboard
Conflicts: inc/config.php inc/display.php inc/functions.php
@ -10,9 +10,8 @@ It contains many changes from original Tinyboard, mainly in frontend area.
|
||||
|
||||
About
|
||||
------------
|
||||
Tinyboard is a light-weight, fast, highly configurable and user-friendly
|
||||
imageboard software package released under a non-restrictive open-source
|
||||
license. It is written in PHP and has few dependencies.
|
||||
Tinyboard is a free light-weight, fast, highly configurable and user-friendly
|
||||
imageboard software package. It is written in PHP and has few dependencies.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
@ -391,6 +391,11 @@
|
||||
// When true, users are instead presented a selectbox for email. Contains, blank, noko and sage.
|
||||
$config['field_email_selectbox'] = false;
|
||||
|
||||
// Attach country flags to posts. Requires the PHP "geoip" extension to be installed:
|
||||
// http://www.php.net/manual/en/intro.geoip.php. In the future, maybe I will find and include a proper
|
||||
// pure-PHP geolocation library.
|
||||
$config['country_flags'] = false;
|
||||
|
||||
// Require users to see the ban page at least once for a ban even if it has since expired.
|
||||
$config['require_ban_view'] = true;
|
||||
|
||||
@ -761,6 +766,17 @@
|
||||
// a link to an email address or IRC chat room to appeal the ban.
|
||||
$config['ban_page_extra'] = '';
|
||||
|
||||
// Display flags (when available). This config option has no effect unless poster flags are enabled (see
|
||||
// $config['country_flags']). Disable this if you want all previously-assigned flags to be hidden.
|
||||
$config['display_flags'] = true;
|
||||
|
||||
// Location of post flags/icons (where "%s" is the flag name). Defaults to static/flags/%s.png.
|
||||
// $config['uri_flags'] = 'http://static.example.org/flags/%s.png';
|
||||
|
||||
// Width and height (and more?) of post flags. Can be overridden with the Tinyboard post modifier:
|
||||
// <tinyboard flag style>.
|
||||
$config['flag_style'] = 'width:16px;height:11px;';
|
||||
|
||||
/*
|
||||
* ====================
|
||||
* Javascript
|
||||
@ -970,7 +986,7 @@
|
||||
// $config['url_favicon'] = '/favicon.gif';
|
||||
|
||||
// EXPERIMENTAL: Try not to build pages when we shouldn't have to.
|
||||
$config['try_smarter'] = false;
|
||||
$config['try_smarter'] = true;
|
||||
|
||||
/*
|
||||
* ====================
|
||||
|
@ -271,36 +271,25 @@ function embed_html($link) {
|
||||
}
|
||||
|
||||
class Post {
|
||||
public function __construct($id, $thread, $subject, $email, $name, $trip, $capcode, $body, $time, $thumb, $thumbx, $thumby, $file, $filex, $filey, $filesize, $filename, $ip, $embed, $root=null, $mod=false) {
|
||||
public function __construct($post, $root=null, $mod=false) {
|
||||
global $config;
|
||||
if (!isset($root))
|
||||
$root = &$config['root'];
|
||||
|
||||
$this->id = $id;
|
||||
$this->thread = $thread;
|
||||
$this->subject = utf8tohtml($subject);
|
||||
$this->email = $email;
|
||||
$this->name = utf8tohtml($name);
|
||||
$this->trip = $trip;
|
||||
$this->capcode = $capcode;
|
||||
$this->body = $body;
|
||||
$this->time = $time;
|
||||
$this->thumb = $thumb;
|
||||
$this->thumbx = $thumbx;
|
||||
$this->thumby = $thumby;
|
||||
$this->file = $file;
|
||||
$this->filex = $filex;
|
||||
$this->filey = $filey;
|
||||
$this->filesize = $filesize;
|
||||
$this->filename = $filename;
|
||||
$this->ip = $ip;
|
||||
$this->embed = $embed;
|
||||
$this->root = $root;
|
||||
foreach ($post as $key => $value) {
|
||||
$this->{$key} = $value;
|
||||
}
|
||||
|
||||
$this->subject = utf8tohtml($this->subject);
|
||||
$this->name = utf8tohtml($this->name);
|
||||
$this->mod = $mod;
|
||||
$this->root = $root;
|
||||
|
||||
if ($this->embed)
|
||||
$this->embed = embed_html($this->embed);
|
||||
|
||||
$this->modifiers = extract_modifiers($this->body_nomarkup);
|
||||
|
||||
if ($this->mod)
|
||||
// Fix internal links
|
||||
// Very complicated regex
|
||||
@ -373,42 +362,30 @@ class Post {
|
||||
};
|
||||
|
||||
class Thread {
|
||||
public function __construct($id, $subject, $email, $name, $trip, $capcode, $body, $time, $thumb, $thumbx, $thumby, $file, $filex, $filey, $filesize, $filename, $ip, $sticky, $locked, $bumplocked, $embed, $root=null, $mod=false, $hr=true) {
|
||||
public function __construct($post, $root = null, $mod = false, $hr = true) {
|
||||
global $config;
|
||||
if (!isset($root))
|
||||
$root = &$config['root'];
|
||||
|
||||
$this->id = $id;
|
||||
$this->subject = utf8tohtml($subject);
|
||||
$this->email = $email;
|
||||
$this->name = utf8tohtml($name);
|
||||
$this->trip = $trip;
|
||||
$this->capcode = $capcode;
|
||||
$this->body = $body;
|
||||
$this->time = $time;
|
||||
$this->thumb = $thumb;
|
||||
$this->thumbx = $thumbx;
|
||||
$this->thumby = $thumby;
|
||||
$this->file = $file;
|
||||
$this->filex = $filex;
|
||||
$this->filey = $filey;
|
||||
$this->filesize = $filesize;
|
||||
$this->filename = $filename;
|
||||
foreach ($post as $key => $value) {
|
||||
$this->{$key} = $value;
|
||||
}
|
||||
|
||||
$this->subject = utf8tohtml($this->subject);
|
||||
$this->name = utf8tohtml($this->name);
|
||||
$this->mod = $mod;
|
||||
$this->root = $root;
|
||||
$this->hr = $hr;
|
||||
|
||||
$this->posts = array();
|
||||
$this->omitted = 0;
|
||||
$this->omitted_images = 0;
|
||||
$this->posts = array();
|
||||
$this->ip = $ip;
|
||||
$this->sticky = $sticky;
|
||||
$this->locked = $locked;
|
||||
$this->bumplocked = $bumplocked;
|
||||
$this->embed = $embed;
|
||||
$this->root = $root;
|
||||
$this->mod = $mod;
|
||||
$this->hr = $hr;
|
||||
|
||||
if ($this->embed)
|
||||
$this->embed = embed_html($this->embed);
|
||||
|
||||
$this->modifiers = extract_modifiers($this->body_nomarkup);
|
||||
|
||||
if ($this->mod)
|
||||
// Fix internal links
|
||||
// Very complicated regex
|
||||
@ -471,7 +448,7 @@ class Thread {
|
||||
$built .= ' <a title="'._('Make thread sticky').'" href="?/' . secure_link($board['dir'] . 'sticky/' . $this->id) . '">' . $config['mod']['link_sticky'] . '</a>';
|
||||
|
||||
if (hasPermission($config['mod']['bumplock'], $board['uri'], $this->mod))
|
||||
if ($this->bumplocked)
|
||||
if ($this->sage)
|
||||
$built .= ' <a title="'._('Allow thread to be bumped').'" href="?/' . secure_link($board['dir'] . 'bumpunlock/' . $this->id) . '">' . $config['mod']['link_bumpunlock'] . '</a>';
|
||||
else
|
||||
$built .= ' <a title="'._('Prevent thread from being bumped').'" href="?/' . secure_link($board['dir'] . 'bumplock/' . $this->id) . '">' . $config['mod']['link_bumplock'] . '</a>';
|
||||
@ -496,10 +473,6 @@ class Thread {
|
||||
return $built;
|
||||
}
|
||||
|
||||
public function ratio() {
|
||||
return fraction($this->filex, $this->filey, ':');
|
||||
}
|
||||
|
||||
public function build($index=false, $isnoko50=false) {
|
||||
global $board, $config, $debug;
|
||||
|
||||
|
@ -153,6 +153,8 @@ function loadConfig() {
|
||||
$config['url_javascript'] = $config['root'] . $config['file_script'];
|
||||
if (!isset($config['additional_javascript_url']))
|
||||
$config['additional_javascript_url'] = $config['root'];
|
||||
if (!isset($config['uri_flags']))
|
||||
$config['uri_flags'] = $config['root'] . 'static/flags/%s.png';
|
||||
|
||||
if ($config['root_file']) {
|
||||
chdir($config['root_file']);
|
||||
@ -1052,11 +1054,7 @@ function index($page, $mod=false) {
|
||||
$threads = array();
|
||||
|
||||
while ($th = $query->fetch(PDO::FETCH_ASSOC)) {
|
||||
$thread = new Thread(
|
||||
$th['id'], $th['subject'], $th['email'], $th['name'], $th['trip'], $th['capcode'], $th['body'], $th['time'], $th['thumb'],
|
||||
$th['thumbwidth'], $th['thumbheight'], $th['file'], $th['filewidth'], $th['fileheight'], $th['filesize'], $th['filename'], $th['ip'],
|
||||
$th['sticky'], $th['locked'], $th['sage'], $th['embed'], $mod ? '?/' : $config['root'], $mod
|
||||
);
|
||||
$thread = new Thread($th, $mod ? '?/' : $config['root'], $mod);
|
||||
|
||||
if ($config['cache']['enabled'] && $cached = cache::get("thread_index_{$board['uri']}_{$th['id']}")) {
|
||||
$replies = $cached['replies'];
|
||||
@ -1088,11 +1086,7 @@ function index($page, $mod=false) {
|
||||
if ($po['file'])
|
||||
$num_images++;
|
||||
|
||||
$thread->add(new Post(
|
||||
$po['id'], $th['id'], $po['subject'], $po['email'], $po['name'], $po['trip'], $po['capcode'], $po['body'], $po['time'],
|
||||
$po['thumb'], $po['thumbwidth'], $po['thumbheight'], $po['file'], $po['filewidth'], $po['fileheight'], $po['filesize'],
|
||||
$po['filename'], $po['ip'], $po['embed'], $mod ? '?/' : $config['root'], $mod)
|
||||
);
|
||||
$thread->add(new Post($po, $mod ? '?/' : $config['root'], $mod));
|
||||
}
|
||||
|
||||
if ($omitted) {
|
||||
@ -1496,55 +1490,33 @@ function unicodify($body) {
|
||||
return $body;
|
||||
}
|
||||
|
||||
function extract_modifiers($body) {
|
||||
$modifiers = array();
|
||||
|
||||
if (preg_match_all('@<tinyboard ([\w\s]+)>(.+?)</tinyboard>@us', $body, $matches, PREG_SET_ORDER)) {
|
||||
foreach ($matches as $match) {
|
||||
if (preg_match('/^escape /', $match[1]))
|
||||
continue;
|
||||
$modifiers[$match[1]] = html_entity_decode($match[2]);
|
||||
}
|
||||
}
|
||||
|
||||
return $modifiers;
|
||||
}
|
||||
|
||||
function markup(&$body, $track_cites = false) {
|
||||
global $board, $config, $markup_urls;
|
||||
|
||||
$modifiers = extract_modifiers($body);
|
||||
|
||||
$body = preg_replace('@<tinyboard ([\w\s]+)>(.+?)</tinyboard>@us', '', $body);
|
||||
|
||||
if (isset($modifiers['raw html']) && $modifiers['raw html'] == '1')
|
||||
return $body;
|
||||
|
||||
$body = str_replace("\r", '', $body);
|
||||
$body = utf8tohtml($body);
|
||||
|
||||
if (preg_match_all('@<tinyboard ([\w\s]+)>(.+?)</tinyboard>@us', $body, $modifiers, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
|
||||
$skip_chars = 0;
|
||||
$body_tmp = $body;
|
||||
$end_markup = false;
|
||||
|
||||
foreach ($modifiers as $modifier) {
|
||||
// preg_match_all is not multibyte-safe
|
||||
foreach ($modifier as &$match) {
|
||||
$match[1] = mb_strlen(substr($body_tmp, 0, $match[1]));
|
||||
}
|
||||
|
||||
$modifier['type'] = $modifier[1][0];
|
||||
$modifier['content'] = $modifier[2][0];
|
||||
|
||||
if ($modifier['type'] == 'ban message') {
|
||||
// Public ban message
|
||||
$replacement = sprintf($config['mod']['ban_message'], html_entity_decode($modifier['content']));
|
||||
if ($end_markup) {
|
||||
$body .= $replacement;
|
||||
}
|
||||
} elseif ($modifier['type'] == 'raw html') {
|
||||
$body = html_entity_decode($modifier['content']);
|
||||
$replacement = '';
|
||||
$end_markup = true;
|
||||
} elseif (preg_match('/^escape /', $modifier['type'])) {
|
||||
// Escaped (not a real modifier)
|
||||
$replacement = '<tinyboard ' . substr($modifier['type'], strlen('escape ')) . '>' . $modifier['content'] . '</tinyboard>';
|
||||
} else {
|
||||
// Unknown
|
||||
$replacement = '';
|
||||
}
|
||||
|
||||
if (!$end_markup) {
|
||||
$body = mb_substr_replace($body, $replacement, $modifier[0][1] + $skip_chars, mb_strlen($modifier[0][0]));
|
||||
$skip_chars += mb_strlen($replacement) - mb_strlen($modifier[0][0]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($end_markup) {
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
if (mysql_version() < 50503)
|
||||
$body = mb_encode_numericentity($body, array(0x010000, 0xffffff, 0, 0xffffff), 'UTF-8');
|
||||
|
||||
@ -1759,17 +1731,9 @@ function buildThread($id, $return = false, $mod = false) {
|
||||
|
||||
while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
|
||||
if (!isset($thread)) {
|
||||
$thread = new Thread(
|
||||
$post['id'], $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'], $post['body'], $post['time'],
|
||||
$post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'], $post['fileheight'], $post['filesize'],
|
||||
$post['filename'], $post['ip'], $post['sticky'], $post['locked'], $post['sage'], $post['embed'], $mod ? '?/' : $config['root'], $mod
|
||||
);
|
||||
$thread = new Thread($post, $mod ? '?/' : $config['root'], $mod);
|
||||
} else {
|
||||
$thread->add(new Post(
|
||||
$post['id'], $thread->id, $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'], $post['body'],
|
||||
$post['time'], $post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'], $post['fileheight'],
|
||||
$post['filesize'], $post['filename'], $post['ip'], $post['embed'], $mod ? '?/' : $config['root'], $mod)
|
||||
);
|
||||
$thread->add(new Post($post, $mod ? '?/' : $config['root'], $mod));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -790,19 +790,9 @@ function mod_page_ip($ip) {
|
||||
|
||||
while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
|
||||
if (!$post['thread']) {
|
||||
// TODO: There is no reason why this should be such a fucking mess.
|
||||
$po = new Thread(
|
||||
$post['id'], $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'], $post['body'],
|
||||
$post['time'], $post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'],
|
||||
$post['fileheight'], $post['filesize'], $post['filename'], $post['ip'], $post['sticky'], $post['locked'],
|
||||
$post['sage'], $post['embed'], '?/', $mod, false
|
||||
);
|
||||
$po = new Thread($post, '?/', $mod, false);
|
||||
} else {
|
||||
$po = new Post(
|
||||
$post['id'], $post['thread'], $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'],
|
||||
$post['body'], $post['time'], $post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'],
|
||||
$post['fileheight'], $post['filesize'], $post['filename'], $post['ip'], $post['embed'], '?/', $mod
|
||||
);
|
||||
$po = new Post($post, '?/', $mod);
|
||||
}
|
||||
|
||||
if (!isset($args['posts'][$board['uri']]))
|
||||
@ -1398,7 +1388,7 @@ function mod_edit_post($board, $edit_raw_html, $postID) {
|
||||
$query->bindValue(':subject', $_POST['subject']);
|
||||
$query->bindValue(':body', $_POST['body']);
|
||||
if ($edit_raw_html) {
|
||||
$body_nomarkup = '<tinyboard raw html>' . $_POST['body'] . '</tinyboard>';
|
||||
$body_nomarkup = $_POST['body'] . '<tinyboard raw html>1</tinyboard>';
|
||||
$query->bindValue(':body_nomarkup', $body_nomarkup);
|
||||
}
|
||||
$query->execute() or error(db_error($query));
|
||||
@ -2012,19 +2002,9 @@ function mod_reports() {
|
||||
|
||||
if (!$post['thread']) {
|
||||
// Still need to fix this:
|
||||
$po = new Thread(
|
||||
$post['id'], $post['subject'], $post['email'], $post['name'], $post['trip'],
|
||||
$post['capcode'], $post['body'], $post['time'], $post['thumb'],
|
||||
$post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'],
|
||||
$post['fileheight'], $post['filesize'], $post['filename'], $post['ip'], $post['sticky'],
|
||||
$post['locked'], $post['sage'], $post['embed'], '?/', $mod, false
|
||||
);
|
||||
$po = new Thread($post, '?/', $mod, false);
|
||||
} else {
|
||||
$po = new Post(
|
||||
$post['id'], $post['thread'], $post['subject'], $post['email'], $post['name'], $post['trip'], $post['capcode'],
|
||||
$post['body'], $post['time'], $post['thumb'], $post['thumbwidth'], $post['thumbheight'], $post['file'], $post['filewidth'],
|
||||
$post['fileheight'], $post['filesize'], $post['filename'], $post['ip'], $post['embed'], '?/', $mod
|
||||
);
|
||||
$po = new Post($post, '?/', $mod);
|
||||
}
|
||||
|
||||
// a little messy and inefficient
|
||||
|
@ -16,10 +16,7 @@ onready(function(){
|
||||
var link = this.getElementsByTagName('a');
|
||||
|
||||
for (var i = 0; i < link.length; i++) {
|
||||
if (typeof link[i] == "object" && link[i].childNodes && typeof link[i].childNodes[0] !== 'undefined' && link[i].childNodes[0].src && link[i].className != 'file') {
|
||||
if (window.jQuery && !$(link).prev().hasClass('fileinfo')) {
|
||||
continue;
|
||||
}
|
||||
if (typeof link[i] == "object" && link[i].childNodes && typeof link[i].childNodes[0] !== 'undefined' && link[i].childNodes[0].src && link[i].childNodes[0].className.match(/post-image/)) {
|
||||
link[i].childNodes[0].style.maxWidth = '95%';
|
||||
link[i].onclick = function(e) {
|
||||
if (this.childNodes[0].className == 'hidden')
|
||||
|
11
post.php
@ -424,7 +424,16 @@ if (isset($_POST['delete'])) {
|
||||
$post['body'] = escape_markup_modifiers($post['body']);
|
||||
|
||||
if ($mod && isset($post['raw']) && $post['raw']) {
|
||||
$post['body'] = '<tinyboard raw html>' . $post['body'] . '</tinyboard>';
|
||||
$post['body'] .= '<tinyboard raw html>1</tinyboard>';
|
||||
}
|
||||
|
||||
if ($config['country_flags']) {
|
||||
if (!geoip_db_avail(GEOIP_COUNTRY_EDITION)) {
|
||||
error('GeoIP not available: ' . geoip_db_filename(GEOIP_COUNTRY_EDITION));
|
||||
}
|
||||
if ($country_code = @geoip_country_code_by_name($_SERVER['REMOTE_ADDR'])) {
|
||||
$post['body'] .= '<tinyboard flag>' . strtolower($country_code) . '</tinyboard>';
|
||||
}
|
||||
}
|
||||
|
||||
if (mysql_version() >= 50503) {
|
||||
|
BIN
static/flags/ad.png
Executable file
After Width: | Height: | Size: 643 B |
BIN
static/flags/ae.png
Executable file
After Width: | Height: | Size: 408 B |
BIN
static/flags/af.png
Executable file
After Width: | Height: | Size: 604 B |
BIN
static/flags/ag.png
Executable file
After Width: | Height: | Size: 591 B |
BIN
static/flags/ai.png
Executable file
After Width: | Height: | Size: 643 B |
BIN
static/flags/al.png
Executable file
After Width: | Height: | Size: 600 B |
BIN
static/flags/am.png
Executable file
After Width: | Height: | Size: 497 B |
BIN
static/flags/an.png
Executable file
After Width: | Height: | Size: 488 B |
BIN
static/flags/ao.png
Executable file
After Width: | Height: | Size: 611 B |
BIN
static/flags/ar.png
Executable file
After Width: | Height: | Size: 506 B |
BIN
static/flags/as.png
Executable file
After Width: | Height: | Size: 647 B |
BIN
static/flags/at.png
Executable file
After Width: | Height: | Size: 403 B |
BIN
static/flags/au.png
Executable file
After Width: | Height: | Size: 673 B |
BIN
static/flags/aw.png
Executable file
After Width: | Height: | Size: 524 B |
BIN
static/flags/ax.png
Executable file
After Width: | Height: | Size: 663 B |
BIN
static/flags/az.png
Executable file
After Width: | Height: | Size: 589 B |
BIN
static/flags/ba.png
Executable file
After Width: | Height: | Size: 593 B |
BIN
static/flags/bb.png
Executable file
After Width: | Height: | Size: 585 B |
BIN
static/flags/bd.png
Executable file
After Width: | Height: | Size: 504 B |
BIN
static/flags/be.png
Executable file
After Width: | Height: | Size: 449 B |
BIN
static/flags/bf.png
Executable file
After Width: | Height: | Size: 497 B |
BIN
static/flags/bg.png
Executable file
After Width: | Height: | Size: 462 B |
BIN
static/flags/bh.png
Executable file
After Width: | Height: | Size: 457 B |
BIN
static/flags/bi.png
Executable file
After Width: | Height: | Size: 675 B |
BIN
static/flags/bj.png
Executable file
After Width: | Height: | Size: 486 B |
BIN
static/flags/bm.png
Executable file
After Width: | Height: | Size: 611 B |
BIN
static/flags/bn.png
Executable file
After Width: | Height: | Size: 639 B |
BIN
static/flags/bo.png
Executable file
After Width: | Height: | Size: 500 B |
BIN
static/flags/br.png
Executable file
After Width: | Height: | Size: 593 B |
BIN
static/flags/bs.png
Executable file
After Width: | Height: | Size: 526 B |
BIN
static/flags/bt.png
Executable file
After Width: | Height: | Size: 631 B |
BIN
static/flags/bv.png
Executable file
After Width: | Height: | Size: 512 B |
BIN
static/flags/bw.png
Executable file
After Width: | Height: | Size: 443 B |
BIN
static/flags/by.png
Executable file
After Width: | Height: | Size: 514 B |
BIN
static/flags/bz.png
Executable file
After Width: | Height: | Size: 600 B |
BIN
static/flags/ca.png
Executable file
After Width: | Height: | Size: 628 B |
BIN
static/flags/cc.png
Executable file
After Width: | Height: | Size: 625 B |
BIN
static/flags/cd.png
Executable file
After Width: | Height: | Size: 571 B |
BIN
static/flags/cf.png
Executable file
After Width: | Height: | Size: 614 B |
BIN
static/flags/cg.png
Executable file
After Width: | Height: | Size: 521 B |
BIN
static/flags/ch.png
Executable file
After Width: | Height: | Size: 367 B |
BIN
static/flags/ci.png
Executable file
After Width: | Height: | Size: 453 B |
BIN
static/flags/ck.png
Executable file
After Width: | Height: | Size: 586 B |
BIN
static/flags/cl.png
Executable file
After Width: | Height: | Size: 450 B |
BIN
static/flags/cm.png
Executable file
After Width: | Height: | Size: 525 B |
BIN
static/flags/cn.png
Executable file
After Width: | Height: | Size: 472 B |
BIN
static/flags/co.png
Executable file
After Width: | Height: | Size: 483 B |
BIN
static/flags/cr.png
Executable file
After Width: | Height: | Size: 477 B |
BIN
static/flags/cs.png
Executable file
After Width: | Height: | Size: 439 B |
BIN
static/flags/cu.png
Executable file
After Width: | Height: | Size: 563 B |
BIN
static/flags/cv.png
Executable file
After Width: | Height: | Size: 529 B |
BIN
static/flags/cx.png
Executable file
After Width: | Height: | Size: 608 B |
BIN
static/flags/cy.png
Executable file
After Width: | Height: | Size: 428 B |
BIN
static/flags/cz.png
Executable file
After Width: | Height: | Size: 476 B |
BIN
static/flags/de.png
Executable file
After Width: | Height: | Size: 545 B |
BIN
static/flags/dj.png
Executable file
After Width: | Height: | Size: 572 B |
BIN
static/flags/dk.png
Executable file
After Width: | Height: | Size: 495 B |
BIN
static/flags/dm.png
Executable file
After Width: | Height: | Size: 620 B |
BIN
static/flags/do.png
Executable file
After Width: | Height: | Size: 508 B |
BIN
static/flags/dz.png
Executable file
After Width: | Height: | Size: 582 B |
BIN
static/flags/ec.png
Executable file
After Width: | Height: | Size: 500 B |
BIN
static/flags/ee.png
Executable file
After Width: | Height: | Size: 429 B |
BIN
static/flags/eg.png
Executable file
After Width: | Height: | Size: 465 B |
BIN
static/flags/eh.png
Executable file
After Width: | Height: | Size: 508 B |
BIN
static/flags/er.png
Executable file
After Width: | Height: | Size: 653 B |
BIN
static/flags/es.png
Executable file
After Width: | Height: | Size: 469 B |
BIN
static/flags/et.png
Executable file
After Width: | Height: | Size: 592 B |
BIN
static/flags/fi.png
Executable file
After Width: | Height: | Size: 489 B |
BIN
static/flags/fj.png
Executable file
After Width: | Height: | Size: 610 B |
BIN
static/flags/fk.png
Executable file
After Width: | Height: | Size: 648 B |
BIN
static/flags/fm.png
Executable file
After Width: | Height: | Size: 552 B |
BIN
static/flags/fo.png
Executable file
After Width: | Height: | Size: 474 B |
BIN
static/flags/fr.png
Executable file
After Width: | Height: | Size: 545 B |
BIN
static/flags/ga.png
Executable file
After Width: | Height: | Size: 489 B |
BIN
static/flags/gb.png
Executable file
After Width: | Height: | Size: 699 B |
BIN
static/flags/gd.png
Executable file
After Width: | Height: | Size: 637 B |
BIN
static/flags/ge.png
Executable file
After Width: | Height: | Size: 594 B |
BIN
static/flags/gh.png
Executable file
After Width: | Height: | Size: 490 B |
BIN
static/flags/gi.png
Executable file
After Width: | Height: | Size: 463 B |
BIN
static/flags/gl.png
Executable file
After Width: | Height: | Size: 470 B |
BIN
static/flags/gm.png
Executable file
After Width: | Height: | Size: 493 B |
BIN
static/flags/gn.png
Executable file
After Width: | Height: | Size: 480 B |
BIN
static/flags/gp.png
Executable file
After Width: | Height: | Size: 488 B |
BIN
static/flags/gq.png
Executable file
After Width: | Height: | Size: 537 B |
BIN
static/flags/gr.png
Executable file
After Width: | Height: | Size: 487 B |
BIN
static/flags/gs.png
Executable file
After Width: | Height: | Size: 630 B |
BIN
static/flags/gt.png
Executable file
After Width: | Height: | Size: 493 B |
BIN
static/flags/gu.png
Executable file
After Width: | Height: | Size: 509 B |
BIN
static/flags/gw.png
Executable file
After Width: | Height: | Size: 516 B |
BIN
static/flags/gy.png
Executable file
After Width: | Height: | Size: 645 B |
BIN
static/flags/hk.png
Executable file
After Width: | Height: | Size: 527 B |
BIN
static/flags/hn.png
Executable file
After Width: | Height: | Size: 537 B |
BIN
static/flags/hr.png
Executable file
After Width: | Height: | Size: 524 B |