add smaller banner for teeny tiny terminals
This commit is contained in:
parent
f8760a1fa8
commit
03c981bf72
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/sh
|
||||||
|
s=(`stty size`)
|
||||||
|
c=${s[1]}
|
||||||
|
|
||||||
|
|
||||||
|
if [ $c -gt 99 ] ; then
|
||||||
|
cat ../cluecon2.tmpl
|
||||||
|
else
|
||||||
|
cat ../cluecon2_small.tmpl
|
||||||
|
fi
|
2
cc.sh
2
cc.sh
|
@ -1,8 +1,10 @@
|
||||||
cc=`cat cluecon.tmpl | sed 's/\\\\/\\\\\\\\/g' | awk '{printf "%s\\\\n", $0}' `
|
cc=`cat cluecon.tmpl | sed 's/\\\\/\\\\\\\\/g' | awk '{printf "%s\\\\n", $0}' `
|
||||||
|
cc_s=`cat cluecon_small.tmpl | sed 's/\\\\/\\\\\\\\/g' | awk '{printf "%s\\\\n", $0}' `
|
||||||
|
|
||||||
cat <<EOF > src/include/cc.h
|
cat <<EOF > src/include/cc.h
|
||||||
|
|
||||||
const char *cc = "$cc";
|
const char *cc = "$cc";
|
||||||
|
const char *cc_s = "$cc_s";
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
[01;44;33m
|
||||||
|
.===============================================================.
|
||||||
|
| _ |
|
||||||
|
| ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |
|
||||||
|
| / __| | | | |/ _ \/ __/ _ \| '_ \ / __/ _ \| '_ ` _ \ |
|
||||||
|
| | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |
|
||||||
|
| \___|_|\__,_|\___|\___\___/|_| |_| (_) \___\___/|_| |_| |_| |
|
||||||
|
| |
|
||||||
|
.===============================================================.
|
||||||
|
[0m
|
|
@ -0,0 +1,8 @@
|
||||||
|
.===============================================================.
|
||||||
|
| _ |
|
||||||
|
| ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |
|
||||||
|
| / __| | | | |/ _ \/ __/ _ \| '_ \ / __/ _ \| '_ ` _ \ |
|
||||||
|
| | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |
|
||||||
|
| \___|_|\__,_|\___|\___\___/|_| |_| (_) \___\___/|_| |_| |_| |
|
||||||
|
| |
|
||||||
|
.===============================================================.
|
|
@ -116,6 +116,31 @@ static void clear_cli(void) {
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void screen_size(int *x, int *y)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((ret = GetConsoleScreenBufferInfo(GetStdHandle( STD_OUTPUT_HANDLE ), &csbi))) {
|
||||||
|
if (x) *x = csbi.dwSize.X;
|
||||||
|
if (y) *y = csbi.dwSize.Y;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif TIOCGWINSZ
|
||||||
|
struct winsize w;
|
||||||
|
ioctl(0, TIOCGWINSZ, &w);
|
||||||
|
|
||||||
|
if (x) *x = w.ws_col;
|
||||||
|
if (y) *y = w.ws_row;
|
||||||
|
#else
|
||||||
|
if (x) *x = 24;
|
||||||
|
if (x) *x = 80;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* If a fnkey is configured then process the command */
|
/* If a fnkey is configured then process the command */
|
||||||
static unsigned char console_fnkey_pressed(int i)
|
static unsigned char console_fnkey_pressed(int i)
|
||||||
{
|
{
|
||||||
|
@ -923,13 +948,19 @@ static const char *inf = "Type /help <enter> to see a list of commands\n\n\n";
|
||||||
|
|
||||||
static void print_banner(FILE *stream)
|
static void print_banner(FILE *stream)
|
||||||
{
|
{
|
||||||
|
int x;
|
||||||
|
const char *use = NULL;
|
||||||
#include <cc.h>
|
#include <cc.h>
|
||||||
|
|
||||||
|
screen_size(&x, NULL);
|
||||||
|
|
||||||
|
use = (x > 100) ? cc : cc_s;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
/* Print banner in yellow with blue background */
|
/* Print banner in yellow with blue background */
|
||||||
SetConsoleTextAttribute(hStdout, ESL_SEQ_FYELLOW | BACKGROUND_BLUE);
|
SetConsoleTextAttribute(hStdout, ESL_SEQ_FYELLOW | BACKGROUND_BLUE);
|
||||||
WriteFile(hStdout, banner, (DWORD) strlen(banner), NULL, NULL);
|
WriteFile(hStdout, banner, (DWORD) strlen(banner), NULL, NULL);
|
||||||
WriteFile(hStdout, cc, (DWORD) strlen(cc), NULL, NULL);
|
WriteFile(hStdout, use, (DWORD) strlen(use), NULL, NULL);
|
||||||
SetConsoleTextAttribute(hStdout, wOldColorAttrs);
|
SetConsoleTextAttribute(hStdout, wOldColorAttrs);
|
||||||
|
|
||||||
/* Print the rest info in default colors */
|
/* Print the rest info in default colors */
|
||||||
|
@ -940,10 +971,14 @@ static void print_banner(FILE *stream)
|
||||||
ESL_SEQ_DEFAULT_COLOR,
|
ESL_SEQ_DEFAULT_COLOR,
|
||||||
ESL_SEQ_FYELLOW, ESL_SEQ_BBLUE,
|
ESL_SEQ_FYELLOW, ESL_SEQ_BBLUE,
|
||||||
banner,
|
banner,
|
||||||
cc, ESL_SEQ_DEFAULT_COLOR, inf);
|
use, ESL_SEQ_DEFAULT_COLOR, inf);
|
||||||
|
|
||||||
fprintf(stream, "%s", output_text_color);
|
fprintf(stream, "%s", output_text_color);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (x < 160) {
|
||||||
|
fprintf(stream, "\n[This app Best viewed at 160x60 or more..]\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_fn_keys(cli_profile_t *profile)
|
static void set_fn_keys(cli_profile_t *profile)
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
const char *cc = ".========================================================================================================.\n| ____ _____ ____ _ ____ _ _ _____ |\n| / ___|___ _ __ ___ ___ |_ _|__ / ___| |_ _ ___ / ___|___ _ __ ( ) |___ / |\n| | | / _ \\| '_ ` _ \\ / _ \\ | |/ _ \\ | | | | | | |/ _ \\ | / _ \\| '_ \\ |/| | |_ \\ |\n| | |__| (_) | | | | | | __/ | | (_) | | |___| | |_| | __/ |__| (_) | | | | | |___) | |\n| \\____\\___/|_| |_| |_|\\___| |_|\\___/ \\____|_|\\__,_|\\___|\\____\\___/|_| |_| |_|____/ |\n| |\n| ____ _ _ _ _ ____ _ |\n| / ___| |__ (_) ___ __ _ __ _ ___ | | | / ___| / \\ |\n| | | | '_ \\| |/ __/ _` |/ _` |/ _ \\ | | | \\___ \\ / _ \\ |\n| | |___| | | | | (_| (_| | (_| | (_) | | |_| |___) / ___ \\ |\n| \\____|_| |_|_|\\___\\__,_|\\__, |\\___( ) \\___/|____/_/ \\_\\ |\n| |___/ |/ |\n| _ _ __ _ _ ___ _ _ ____ ___ _ _____ |\n| / \\ _ _ __ _ _ _ ___| |_ / /_ | |_| |__ ( _ )| |_| |__ |___ \\ / _ \\/ |___ / |\n| / _ \\| | | |/ _` | | | / __| __| | '_ \\| __| '_ \\ _____ / _ \\| __| '_ \\ __) | | | | | |_ \\ |\n| / ___ \\ |_| | (_| | |_| \\__ \\ |_ | (_) | |_| | | | |_____| | (_) | |_| | | | / __/| |_| | |___) | |\n| /_/ \\_\\__,_|\\__, |\\__,_|___/\\__| \\___/ \\__|_| |_| \\___/ \\__|_| |_| |_____|\\___/|_|____/ |\n| |___/ |\n| _ |\n| __ ____ ____ __ ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |\n| \\ \\ /\\ / /\\ \\ /\\ / /\\ \\ /\\ / / / __| | | | |/ _ \\/ __/ _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| \\ V V / \\ V V / \\ V V / _ | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |\n| \\_/\\_/ \\_/\\_/ \\_/\\_/ (_) \\___|_|\\__,_|\\___|\\___\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.========================================================================================================.\n";
|
|
||||||
|
const char *cc = ".========================================================================================================.\n| ____ _____ ____ _ ____ _ _ _____ |\n| / ___|___ _ __ ___ ___ |_ _|__ / ___| |_ _ ___ / ___|___ _ __ ( ) |___ / |\n| | | / _ \\| '_ ` _ \\ / _ \\ | |/ _ \\ | | | | | | |/ _ \\ | / _ \\| '_ \\ |/| | |_ \\ |\n| | |__| (_) | | | | | | __/ | | (_) | | |___| | |_| | __/ |__| (_) | | | | | |___) | |\n| \\____\\___/|_| |_| |_|\\___| |_|\\___/ \\____|_|\\__,_|\\___|\\____\\___/|_| |_| |_|____/ |\n| |\n| ____ _ _ _ _ ____ _ |\n| / ___| |__ (_) ___ __ _ __ _ ___ | | | / ___| / \\ |\n| | | | '_ \\| |/ __/ _` |/ _` |/ _ \\ | | | \\___ \\ / _ \\ |\n| | |___| | | | | (_| (_| | (_| | (_) | | |_| |___) / ___ \\ |\n| \\____|_| |_|_|\\___\\__,_|\\__, |\\___( ) \\___/|____/_/ \\_\\ |\n| |___/ |/ |\n| _ _ __ _ _ ___ _ _ ____ ___ _ _____ |\n| / \\ _ _ __ _ _ _ ___| |_ / /_ | |_| |__ ( _ )| |_| |__ |___ \\ / _ \\/ |___ / |\n| / _ \\| | | |/ _` | | | / __| __| | '_ \\| __| '_ \\ _____ / _ \\| __| '_ \\ __) | | | | | |_ \\ |\n| / ___ \\ |_| | (_| | |_| \\__ \\ |_ | (_) | |_| | | | |_____| | (_) | |_| | | | / __/| |_| | |___) | |\n| /_/ \\_\\__,_|\\__, |\\__,_|___/\\__| \\___/ \\__|_| |_| \\___/ \\__|_| |_| |_____|\\___/|_|____/ |\n| |___/ |\n| _ |\n| __ ____ ____ __ ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |\n| \\ \\ /\\ / /\\ \\ /\\ / /\\ \\ /\\ / / / __| | | | |/ _ \\/ __/ _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| \\ V V / \\ V V / \\ V V / _ | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |\n| \\_/\\_/ \\_/\\_/ \\_/\\_/ (_) \\___|_|\\__,_|\\___|\\___\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.========================================================================================================.\n";
|
||||||
|
const char *cc_s = ".===============================================================.\n| _ |\n| ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |\n| / __| | | | |/ _ \\/ __/ _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |\n| \\___|_|\\__,_|\\___|\\___\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.===============================================================.\n";
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
const char *cc = ".========================================================================================================.\n| ____ _____ ____ _ ____ _ _ _____ |\n| / ___|___ _ __ ___ ___ |_ _|__ / ___| |_ _ ___ / ___|___ _ __ ( ) |___ / |\n| | | / _ \\| '_ ` _ \\ / _ \\ | |/ _ \\ | | | | | | |/ _ \\ | / _ \\| '_ \\ |/| | |_ \\ |\n| | |__| (_) | | | | | | __/ | | (_) | | |___| | |_| | __/ |__| (_) | | | | | |___) | |\n| \\____\\___/|_| |_| |_|\\___| |_|\\___/ \\____|_|\\__,_|\\___|\\____\\___/|_| |_| |_|____/ |\n| |\n| ____ _ _ _ _ ____ _ |\n| / ___| |__ (_) ___ __ _ __ _ ___ | | | / ___| / \\ |\n| | | | '_ \\| |/ __/ _` |/ _` |/ _ \\ | | | \\___ \\ / _ \\ |\n| | |___| | | | | (_| (_| | (_| | (_) | | |_| |___) / ___ \\ |\n| \\____|_| |_|_|\\___\\__,_|\\__, |\\___( ) \\___/|____/_/ \\_\\ |\n| |___/ |/ |\n| _ _ __ _ _ ___ _ _ ____ ___ _ _____ |\n| / \\ _ _ __ _ _ _ ___| |_ / /_ | |_| |__ ( _ )| |_| |__ |___ \\ / _ \\/ |___ / |\n| / _ \\| | | |/ _` | | | / __| __| | '_ \\| __| '_ \\ _____ / _ \\| __| '_ \\ __) | | | | | |_ \\ |\n| / ___ \\ |_| | (_| | |_| \\__ \\ |_ | (_) | |_| | | | |_____| | (_) | |_| | | | / __/| |_| | |___) | |\n| /_/ \\_\\__,_|\\__, |\\__,_|___/\\__| \\___/ \\__|_| |_| \\___/ \\__|_| |_| |_____|\\___/|_|____/ |\n| |___/ |\n| _ |\n| __ ____ ____ __ ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |\n| \\ \\ /\\ / /\\ \\ /\\ / /\\ \\ /\\ / / / __| | | | |/ _ \\/ __/ _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| \\ V V / \\ V V / \\ V V / _ | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |\n| \\_/\\_/ \\_/\\_/ \\_/\\_/ (_) \\___|_|\\__,_|\\___|\\___\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.========================================================================================================.\n";
|
|
||||||
|
const char *cc = ".========================================================================================================.\n| ____ _____ ____ _ ____ _ _ _____ |\n| / ___|___ _ __ ___ ___ |_ _|__ / ___| |_ _ ___ / ___|___ _ __ ( ) |___ / |\n| | | / _ \\| '_ ` _ \\ / _ \\ | |/ _ \\ | | | | | | |/ _ \\ | / _ \\| '_ \\ |/| | |_ \\ |\n| | |__| (_) | | | | | | __/ | | (_) | | |___| | |_| | __/ |__| (_) | | | | | |___) | |\n| \\____\\___/|_| |_| |_|\\___| |_|\\___/ \\____|_|\\__,_|\\___|\\____\\___/|_| |_| |_|____/ |\n| |\n| ____ _ _ _ _ ____ _ |\n| / ___| |__ (_) ___ __ _ __ _ ___ | | | / ___| / \\ |\n| | | | '_ \\| |/ __/ _` |/ _` |/ _ \\ | | | \\___ \\ / _ \\ |\n| | |___| | | | | (_| (_| | (_| | (_) | | |_| |___) / ___ \\ |\n| \\____|_| |_|_|\\___\\__,_|\\__, |\\___( ) \\___/|____/_/ \\_\\ |\n| |___/ |/ |\n| _ _ __ _ _ ___ _ _ ____ ___ _ _____ |\n| / \\ _ _ __ _ _ _ ___| |_ / /_ | |_| |__ ( _ )| |_| |__ |___ \\ / _ \\/ |___ / |\n| / _ \\| | | |/ _` | | | / __| __| | '_ \\| __| '_ \\ _____ / _ \\| __| '_ \\ __) | | | | | |_ \\ |\n| / ___ \\ |_| | (_| | |_| \\__ \\ |_ | (_) | |_| | | | |_____| | (_) | |_| | | | / __/| |_| | |___) | |\n| /_/ \\_\\__,_|\\__, |\\__,_|___/\\__| \\___/ \\__|_| |_| \\___/ \\__|_| |_| |_____|\\___/|_|____/ |\n| |___/ |\n| _ |\n| __ ____ ____ __ ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |\n| \\ \\ /\\ / /\\ \\ /\\ / /\\ \\ /\\ / / / __| | | | |/ _ \\/ __/ _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| \\ V V / \\ V V / \\ V V / _ | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |\n| \\_/\\_/ \\_/\\_/ \\_/\\_/ (_) \\___|_|\\__,_|\\___|\\___\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.========================================================================================================.\n";
|
||||||
|
const char *cc_s = ".===============================================================.\n| _ |\n| ___| |_ _ ___ ___ ___ _ __ ___ ___ _ __ ___ |\n| / __| | | | |/ _ \\/ __/ _ \\| '_ \\ / __/ _ \\| '_ ` _ \\ |\n| | (__| | |_| | __/ (_| (_) | | | | _ | (_| (_) | | | | | | |\n| \\___|_|\\__,_|\\___|\\___\\___/|_| |_| (_) \\___\\___/|_| |_| |_| |\n| |\n.===============================================================.\n";
|
||||||
|
|
||||||
|
|
|
@ -186,6 +186,31 @@ SWITCH_DECLARE(FILE *) switch_core_get_console(void)
|
||||||
return runtime.console;
|
return runtime.console;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SWITCH_DECLARE(void) switch_core_screen_size(int *x, int *y)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((ret = GetConsoleScreenBufferInfo(GetStdHandle( STD_OUTPUT_HANDLE ), &csbi))) {
|
||||||
|
if (x) *x = csbi.dwSize.X;
|
||||||
|
if (y) *y = csbi.dwSize.Y;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif TIOCGWINSZ
|
||||||
|
struct winsize w;
|
||||||
|
ioctl(0, TIOCGWINSZ, &w);
|
||||||
|
|
||||||
|
if (x) *x = w.ws_col;
|
||||||
|
if (y) *y = w.ws_row;
|
||||||
|
#else
|
||||||
|
if (x) *x = 24;
|
||||||
|
if (x) *x = 80;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(FILE *) switch_core_data_channel(switch_text_channel_t channel)
|
SWITCH_DECLARE(FILE *) switch_core_data_channel(switch_text_channel_t channel)
|
||||||
{
|
{
|
||||||
FILE *handle = stdout;
|
FILE *handle = stdout;
|
||||||
|
@ -1964,6 +1989,8 @@ SWITCH_DECLARE(switch_status_t) switch_core_init_and_modload(switch_core_flag_t
|
||||||
{
|
{
|
||||||
switch_event_t *event;
|
switch_event_t *event;
|
||||||
char *cmd;
|
char *cmd;
|
||||||
|
int x = 0;
|
||||||
|
const char *use = NULL;
|
||||||
#include "cc.h"
|
#include "cc.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -2000,14 +2027,19 @@ SWITCH_DECLARE(switch_status_t) switch_core_init_and_modload(switch_core_flag_t
|
||||||
switch_event_fire(&event);
|
switch_event_fire(&event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch_core_screen_size(&x, NULL);
|
||||||
|
|
||||||
|
use = (x > 100) ? cc : cc_s;
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s%s\n\n", switch_core_banner(), cc);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s%s\n\n", switch_core_banner(), use);
|
||||||
#else
|
#else
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s%s%s%s%s%s\n\n",
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "%s%s%s%s%s%s\n\n",
|
||||||
SWITCH_SEQ_DEFAULT_COLOR,
|
SWITCH_SEQ_DEFAULT_COLOR,
|
||||||
SWITCH_SEQ_FYELLOW, SWITCH_SEQ_BBLUE,
|
SWITCH_SEQ_FYELLOW, SWITCH_SEQ_BBLUE,
|
||||||
switch_core_banner(),
|
switch_core_banner(),
|
||||||
cc, SWITCH_SEQ_DEFAULT_COLOR);
|
use, SWITCH_SEQ_DEFAULT_COLOR);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -2017,6 +2049,11 @@ SWITCH_DECLARE(switch_status_t) switch_core_init_and_modload(switch_core_flag_t
|
||||||
switch_core_session_limit(0),
|
switch_core_session_limit(0),
|
||||||
switch_core_sessions_per_second(0), switch_test_flag((&runtime), SCF_USE_SQL) ? "Enabled" : "Disabled");
|
switch_core_sessions_per_second(0), switch_test_flag((&runtime), SCF_USE_SQL) ? "Enabled" : "Disabled");
|
||||||
|
|
||||||
|
|
||||||
|
if (x < 160) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "\n[This app Best viewed at 160x60 or more..]\n");
|
||||||
|
}
|
||||||
|
|
||||||
switch_clear_flag((&runtime), SCF_NO_NEW_SESSIONS);
|
switch_clear_flag((&runtime), SCF_NO_NEW_SESSIONS);
|
||||||
|
|
||||||
if ((cmd = switch_core_get_variable_dup("api_on_startup"))) {
|
if ((cmd = switch_core_get_variable_dup("api_on_startup"))) {
|
||||||
|
|
Loading…
Reference in New Issue