Commit 9a659dcf authored by unknown's avatar unknown

Merge work.mysql.com:/home/bk/mysql

into mysql.sashanet.com:/home/sasha/src/bk/mysql

parents 1100a260 e23a0222
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -109,7 +109,7 @@ static HashTable ht; ...@@ -109,7 +109,7 @@ static HashTable ht;
enum enum_info_type { INFO_INFO,INFO_ERROR,INFO_RESULT}; enum enum_info_type { INFO_INFO,INFO_ERROR,INFO_RESULT};
typedef enum enum_info_type INFO_TYPE; typedef enum enum_info_type INFO_TYPE;
const char *VER="11.4"; const char *VER="11.6";
static MYSQL mysql; /* The connection */ static MYSQL mysql; /* The connection */
static bool info_flag=0,ignore_errors=0,wait_flag=0,quick=0, static bool info_flag=0,ignore_errors=0,wait_flag=0,quick=0,
...@@ -496,14 +496,12 @@ static void usage(int version) ...@@ -496,14 +496,12 @@ static void usage(int version)
Give a variable an value. --help lists variables.\n\ Give a variable an value. --help lists variables.\n\
-o, --one-database Only update the default database. This is useful\n\ -o, --one-database Only update the default database. This is useful\n\
for skipping updates to other database in the update\n\ for skipping updates to other database in the update\n\
log.\n\ log.\n");
--tee=... Append everything into outfile. See interactive help\n\
(\\h) also. Does not work in batch mode.\n");
#ifndef __WIN__ #ifndef __WIN__
printf("\ printf("\
--pager[=...] Output type. Default is your ENV variable PAGER.\n\ --pager[=...] Output type. Default is your ENV variable PAGER.\n\
Valid pagers are less, more, cat [> filename], etc.\n\ Valid pagers are less, more, cat [> filename], etc.\n\
See interactive help (\\h) also. This options does\n\ See interactive help (\\h) also. This option does\n\
not work in batch mode.\n"); not work in batch mode.\n");
#endif #endif
printf("\ printf("\
...@@ -524,7 +522,9 @@ static void usage(int version) ...@@ -524,7 +522,9 @@ static void usage(int version)
#include "sslopt-usage.h" #include "sslopt-usage.h"
printf("\ printf("\
-t --table Output in table format.\n\ -t --table Output in table format.\n\
-T, --debug-info Print some debug info at exit.\n"); -T, --debug-info Print some debug info at exit.\n\
--tee=... Append everything into outfile. See interactive help\n\
(\\h) also. Does not work in batch mode.\n");
#ifndef DONT_ALLOW_USER_CHANGE #ifndef DONT_ALLOW_USER_CHANGE
printf("\ printf("\
-u, --user=# User for login if not current user.\n"); -u, --user=# User for login if not current user.\n");
...@@ -763,16 +763,6 @@ static int read_lines(bool execute_commands) ...@@ -763,16 +763,6 @@ static int read_lines(bool execute_commands)
status.query_start_line=line_number; status.query_start_line=line_number;
} }
else else
#ifdef __WIN__
{
tee_fprintf(stdout, glob_buffer.is_empty() ? "mysql> " :
!in_string ? " -> " :
in_string == '\'' ?
" '> " : " \"> ");
linebuffer[0]=(char) sizeof(linebuffer);
line=_cgets(linebuffer);
}
#else
{ {
if (opt_outfile) if (opt_outfile)
{ {
...@@ -783,14 +773,22 @@ static int read_lines(bool execute_commands) ...@@ -783,14 +773,22 @@ static int read_lines(bool execute_commands)
in_string == '\'' ? in_string == '\'' ?
" '> " : " \"> ", OUTFILE); " '> " : " \"> ", OUTFILE);
} }
#ifdef __WIN__
tee_fprintf(stdout, glob_buffer.is_empty() ? "mysql> " :
!in_string ? " -> " :
in_string == '\'' ?
" '> " : " \"> ");
linebuffer[0]=(char) sizeof(linebuffer);
line=_cgets(linebuffer);
#else
line=readline((char*) (glob_buffer.is_empty() ? "mysql> " : line=readline((char*) (glob_buffer.is_empty() ? "mysql> " :
!in_string ? " -> " : !in_string ? " -> " :
in_string == '\'' ? in_string == '\'' ?
" '> " : " \"> ")); " '> " : " \"> "));
#endif
if (opt_outfile) if (opt_outfile)
fprintf(OUTFILE, "%s\n", line); fprintf(OUTFILE, "%s\n", line);
} }
#endif
if (!line) // End of file if (!line) // End of file
{ {
status.exit_status=0; status.exit_status=0;
...@@ -1762,7 +1760,7 @@ com_pager(String *buffer, char *line __attribute__((unused))) ...@@ -1762,7 +1760,7 @@ com_pager(String *buffer, char *line __attribute__((unused)))
{ {
if (!strlen(default_pager)) if (!strlen(default_pager))
{ {
tee_fprintf(stdout, "Default pager wasn't available, using stdout.\n"); tee_fprintf(stdout, "Default pager wasn't set, using stdout.\n");
opt_nopager=1; opt_nopager=1;
strmov(pager, "stdout"); strmov(pager, "stdout");
PAGER= stdout; PAGER= stdout;
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include <my_pthread.h> /* because of signal() */ #include <my_pthread.h> /* because of signal() */
#endif #endif
#define ADMIN_VERSION "8.11" #define ADMIN_VERSION "8.12"
#define MAX_MYSQL_VAR 64 #define MAX_MYSQL_VAR 64
#define MAX_TIME_TO_WAIT 3600 /* Wait for shutdown */ #define MAX_TIME_TO_WAIT 3600 /* Wait for shutdown */
#define MAX_TRUNC_LENGTH 3 #define MAX_TRUNC_LENGTH 3
......
...@@ -66,6 +66,7 @@ static HA_ERRORS ha_errlist[]= ...@@ -66,6 +66,7 @@ static HA_ERRORS ha_errlist[]=
{ 142,"Unknown character set used"}, { 142,"Unknown character set used"},
{ 143,"Conflicting table definition between MERGE and mapped table"}, { 143,"Conflicting table definition between MERGE and mapped table"},
{ 144,"Table is crashed and last repair failed"}, { 144,"Table is crashed and last repair failed"},
{ 145,"Table was marked as crashed and should be repaired"},
{ 0,NullS }, { 0,NullS },
}; };
......
...@@ -207,6 +207,7 @@ enum ha_base_keytype { ...@@ -207,6 +207,7 @@ enum ha_base_keytype {
#define HA_ERR_UNKNOWN_CHARSET 142 /* Can't open charset */ #define HA_ERR_UNKNOWN_CHARSET 142 /* Can't open charset */
#define HA_ERR_WRONG_TABLE_DEF 143 #define HA_ERR_WRONG_TABLE_DEF 143
#define HA_ERR_CRASHED_ON_REPAIR 144 /* Last (automatic?) repair failed */ #define HA_ERR_CRASHED_ON_REPAIR 144 /* Last (automatic?) repair failed */
#define HA_ERR_CRASHED_ON_USAGE 145 /* Table must be repaired */
/* Other constants */ /* Other constants */
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
int nisam_rnext(N_INFO *info, byte *buf, int inx) int nisam_rnext(N_INFO *info, byte *buf, int inx)
{ {
int error; int error,changed;
uint flag; uint flag;
DBUG_ENTER("nisam_rnext"); DBUG_ENTER("nisam_rnext");
...@@ -40,10 +40,11 @@ int nisam_rnext(N_INFO *info, byte *buf, int inx) ...@@ -40,10 +40,11 @@ int nisam_rnext(N_INFO *info, byte *buf, int inx)
#ifndef NO_LOCKING #ifndef NO_LOCKING
if (_nisam_readinfo(info,F_RDLCK,1)) DBUG_RETURN(-1); if (_nisam_readinfo(info,F_RDLCK,1)) DBUG_RETURN(-1);
#endif #endif
changed=_nisam_test_if_changed(info);
if (!flag) if (!flag)
error=_nisam_search_first(info,info->s->keyinfo+inx, error=_nisam_search_first(info,info->s->keyinfo+inx,
info->s->state.key_root[inx]); info->s->state.key_root[inx]);
else if (_nisam_test_if_changed(info) == 0) else if (!changed)
error=_nisam_search_next(info,info->s->keyinfo+inx,info->lastkey,flag, error=_nisam_search_next(info,info->s->keyinfo+inx,info->lastkey,flag,
info->s->state.key_root[inx]); info->s->state.key_root[inx]);
else else
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
int nisam_rprev(N_INFO *info, byte *buf, int inx) int nisam_rprev(N_INFO *info, byte *buf, int inx)
{ {
int error; int error,changed;
register uint flag; register uint flag;
DBUG_ENTER("nisam_rprev"); DBUG_ENTER("nisam_rprev");
...@@ -40,9 +40,10 @@ int nisam_rprev(N_INFO *info, byte *buf, int inx) ...@@ -40,9 +40,10 @@ int nisam_rprev(N_INFO *info, byte *buf, int inx)
#ifndef NO_LOCKING #ifndef NO_LOCKING
if (_nisam_readinfo(info,F_RDLCK,1)) DBUG_RETURN(-1); if (_nisam_readinfo(info,F_RDLCK,1)) DBUG_RETURN(-1);
#endif #endif
changed=_nisam_test_if_changed(info);
if (!flag) if (!flag)
error=_nisam_search_last(info,info->s->keyinfo+inx,info->s->state.key_root[inx]); error=_nisam_search_last(info,info->s->keyinfo+inx,info->s->state.key_root[inx]);
else if (_nisam_test_if_changed(info) == 0) else if (!changed)
error=_nisam_search_next(info,info->s->keyinfo+inx,info->lastkey,flag, error=_nisam_search_next(info,info->s->keyinfo+inx,info->lastkey,flag,
info->s->state.key_root[inx]); info->s->state.key_root[inx]);
else else
......
...@@ -1450,10 +1450,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, ...@@ -1450,10 +1450,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
mysql->unix_socket=0; mysql->unix_socket=0;
strmov(mysql->server_version,(char*) net->read_pos+1); strmov(mysql->server_version,(char*) net->read_pos+1);
mysql->port=port; mysql->port=port;
mysql->client_flag=client_flag | mysql->options.client_flag; client_flag|=mysql->options.client_flag;
DBUG_PRINT("info",("Server version = '%s' capabilites: %ld status: %d",
mysql->server_version,mysql->server_capabilities,
mysql->server_status));
/* Send client information for access check */ /* Send client information for access check */
client_flag|=CLIENT_CAPABILITIES; client_flag|=CLIENT_CAPABILITIES;
...@@ -1510,6 +1507,10 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, ...@@ -1510,6 +1507,10 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
} }
#endif /* HAVE_OPENSSL */ #endif /* HAVE_OPENSSL */
DBUG_PRINT("info",("Server version = '%s' capabilites: %ld status: %d client_flag: %d",
mysql->server_version,mysql->server_capabilities,
mysql->server_status, client_flag));
int3store(buff+2,max_allowed_packet); int3store(buff+2,max_allowed_packet);
if (user && user[0]) if (user && user[0])
strmake(buff+5,user,32); /* Max user name */ strmake(buff+5,user,32); /* Max user name */
......
...@@ -382,6 +382,7 @@ int _mi_test_if_changed(register MI_INFO *info) ...@@ -382,6 +382,7 @@ int _mi_test_if_changed(register MI_INFO *info)
share->state.unique != info->last_unique || share->state.unique != info->last_unique ||
share->state.update_count != info->last_loop) share->state.update_count != info->last_loop)
{ /* Keyfile has changed */ { /* Keyfile has changed */
DBUG_PRINT("info",("index file changed"));
if (share->state.process != share->this_process) if (share->state.process != share->this_process)
VOID(flush_key_blocks(share->kfile,FLUSH_RELEASE)); VOID(flush_key_blocks(share->kfile,FLUSH_RELEASE));
share->last_process=share->state.process; share->last_process=share->state.process;
......
...@@ -182,7 +182,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) ...@@ -182,7 +182,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
{ {
DBUG_PRINT("error",("Table is marked as crashed")); DBUG_PRINT("error",("Table is marked as crashed"));
my_errno=((share->state.changed & STATE_CRASHED_ON_REPAIR) ? my_errno=((share->state.changed & STATE_CRASHED_ON_REPAIR) ?
HA_ERR_CRASHED_ON_REPAIR : HA_ERR_CRASHED); HA_ERR_CRASHED_ON_REPAIR : HA_ERR_CRASHED_ON_USAGE);
goto err; goto err;
} }
/* Correct max_file_length based on length of sizeof_t */ /* Correct max_file_length based on length of sizeof_t */
...@@ -732,7 +732,8 @@ char *mi_state_info_read(char *ptr, MI_STATE_INFO *state) ...@@ -732,7 +732,8 @@ char *mi_state_info_read(char *ptr, MI_STATE_INFO *state)
state->process= mi_uint4korr(ptr); ptr +=4; state->process= mi_uint4korr(ptr); ptr +=4;
state->unique = mi_uint4korr(ptr); ptr +=4; state->unique = mi_uint4korr(ptr); ptr +=4;
state->status = mi_uint4korr(ptr); ptr +=4; state->status = mi_uint4korr(ptr); ptr +=4;
ptr +=4; /* extra */ state->update_count=mi_uint4korr(ptr); ptr +=4;
for (i=0; i < keys; i++) for (i=0; i < keys; i++)
{ {
state->key_root[i]= mi_sizekorr(ptr); ptr +=8; state->key_root[i]= mi_sizekorr(ptr); ptr +=8;
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
int mi_rnext(MI_INFO *info, byte *buf, int inx) int mi_rnext(MI_INFO *info, byte *buf, int inx)
{ {
int error; int error,changed;
uint flag; uint flag;
DBUG_ENTER("mi_rnext"); DBUG_ENTER("mi_rnext");
...@@ -39,10 +39,13 @@ int mi_rnext(MI_INFO *info, byte *buf, int inx) ...@@ -39,10 +39,13 @@ int mi_rnext(MI_INFO *info, byte *buf, int inx)
DBUG_RETURN(my_errno); DBUG_RETURN(my_errno);
if (info->s->concurrent_insert) if (info->s->concurrent_insert)
rw_rdlock(&info->s->key_root_lock[inx]); rw_rdlock(&info->s->key_root_lock[inx]);
changed=_mi_test_if_changed(info);
if (!flag) if (!flag)
{
error=_mi_search_first(info,info->s->keyinfo+inx, error=_mi_search_first(info,info->s->keyinfo+inx,
info->s->state.key_root[inx]); info->s->state.key_root[inx]);
else if (_mi_test_if_changed(info) == 0) }
else if (!changed)
error=_mi_search_next(info,info->s->keyinfo+inx,info->lastkey, error=_mi_search_next(info,info->s->keyinfo+inx,info->lastkey,
info->lastkey_length,flag, info->lastkey_length,flag,
info->s->state.key_root[inx]); info->s->state.key_root[inx]);
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
int mi_rprev(MI_INFO *info, byte *buf, int inx) int mi_rprev(MI_INFO *info, byte *buf, int inx)
{ {
int error; int error,changed;
register uint flag; register uint flag;
MYISAM_SHARE *share=info->s; MYISAM_SHARE *share=info->s;
DBUG_ENTER("mi_rprev"); DBUG_ENTER("mi_rprev");
...@@ -38,12 +38,13 @@ int mi_rprev(MI_INFO *info, byte *buf, int inx) ...@@ -38,12 +38,13 @@ int mi_rprev(MI_INFO *info, byte *buf, int inx)
if (_mi_readinfo(info,F_RDLCK,1)) if (_mi_readinfo(info,F_RDLCK,1))
DBUG_RETURN(my_errno); DBUG_RETURN(my_errno);
changed=_mi_test_if_changed(info);
if (share->concurrent_insert) if (share->concurrent_insert)
rw_rdlock(&share->key_root_lock[inx]); rw_rdlock(&share->key_root_lock[inx]);
if (!flag) if (!flag)
error=_mi_search_last(info, share->keyinfo+inx, error=_mi_search_last(info, share->keyinfo+inx,
share->state.key_root[inx]); share->state.key_root[inx]);
else if (_mi_test_if_changed(info) == 0) else if (!changed)
error=_mi_search_next(info,share->keyinfo+inx,info->lastkey, error=_mi_search_next(info,share->keyinfo+inx,info->lastkey,
info->lastkey_length,flag, info->lastkey_length,flag,
share->state.key_root[inx]); share->state.key_root[inx]);
......
...@@ -196,7 +196,7 @@ static struct option long_options[] = ...@@ -196,7 +196,7 @@ static struct option long_options[] =
static void print_version(void) static void print_version(void)
{ {
printf("%s Ver 1.36 for %s at %s\n",my_progname,SYSTEM_TYPE, printf("%s Ver 1.37 for %s at %s\n",my_progname,SYSTEM_TYPE,
MACHINE_TYPE); MACHINE_TYPE);
} }
...@@ -502,8 +502,15 @@ static int myisamchk(MI_CHECK *param, my_string filename) ...@@ -502,8 +502,15 @@ static int myisamchk(MI_CHECK *param, my_string filename)
param->error_printed=1; param->error_printed=1;
switch (my_errno) { switch (my_errno) {
case HA_ERR_CRASHED: case HA_ERR_CRASHED:
case HA_ERR_WRONG_TABLE_DEF:
mi_check_print_error(param,"'%s' is not a MyISAM-table",filename); mi_check_print_error(param,"'%s' is not a MyISAM-table",filename);
break; break;
case HA_ERR_CRASHED_ON_USAGE:
mi_check_print_error(param,"'%s' is marked as crashed",filename);
break;
case HA_ERR_CRASHED_ON_REPAIR:
mi_check_print_error(param,"'%s' is marked as crashed after last repair",filename);
break;
case HA_ERR_OLD_FILE: case HA_ERR_OLD_FILE:
mi_check_print_error(param,"'%s' is a old type of MyISAM-table", filename); mi_check_print_error(param,"'%s' is a old type of MyISAM-table", filename);
break; break;
......
...@@ -653,7 +653,7 @@ void thr_unlock(THR_LOCK_DATA *data) ...@@ -653,7 +653,7 @@ void thr_unlock(THR_LOCK_DATA *data)
data->type=TL_UNLOCK; /* Mark unlocked */ data->type=TL_UNLOCK; /* Mark unlocked */
check_locks(lock,"after releasing lock",1); check_locks(lock,"after releasing lock",1);
if (!lock->write.data) /* If no active read locks */ if (!lock->write.data) /* If no active write locks */
{ {
data=lock->write_wait.data; data=lock->write_wait.data;
if (!lock->read.data) /* If no more locks in use */ if (!lock->read.data) /* If no more locks in use */
...@@ -742,7 +742,7 @@ void thr_unlock(THR_LOCK_DATA *data) ...@@ -742,7 +742,7 @@ void thr_unlock(THR_LOCK_DATA *data)
data->next->prev= data->prev; data->next->prev= data->prev;
else else
lock->write_wait.last=data->prev; lock->write_wait.last=data->prev;
(*lock->write.last)=data; /* Put in execute list */ (*lock->write.last)=data; /* Put in execute list */
data->prev=lock->write.last; data->prev=lock->write.last;
lock->write.last= &data->next; lock->write.last= &data->next;
data->next=0; /* Only one write lock */ data->next=0; /* Only one write lock */
...@@ -756,7 +756,7 @@ void thr_unlock(THR_LOCK_DATA *data) ...@@ -756,7 +756,7 @@ void thr_unlock(THR_LOCK_DATA *data)
(lock_type == TL_WRITE_CONCURRENT_INSERT || (lock_type == TL_WRITE_CONCURRENT_INSERT ||
lock_type == TL_WRITE_ALLOW_WRITE)); lock_type == TL_WRITE_ALLOW_WRITE));
} }
else if (lock->read_wait.data) else if (!data && lock->read_wait.data)
free_all_read_locks(lock,0); free_all_read_locks(lock,0);
} }
end: end:
......
...@@ -1162,25 +1162,26 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db, ...@@ -1162,25 +1162,26 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
HA_TRY_READ_ONLY), HA_TRY_READ_ONLY),
READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD, READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD,
ha_open_options | HA_OPEN_FOR_REPAIR, ha_open_options | HA_OPEN_FOR_REPAIR,
entry) || entry) || ! entry->file ||
(entry->file->is_crashed() && entry->file->check_and_repair(thd))) (entry->file->is_crashed() && entry->file->check_and_repair(thd)))
{ {
/* Give right error message */ /* Give right error message */
thd->net.last_error[0]=0; thd->net.last_error[0]=0;
thd->net.last_errno=0; thd->net.last_errno=0;
entry->file->print_error(HA_ERR_CRASHED,MYF(0)); my_error(ER_NOT_KEYFILE, MYF(0), name, my_errno);
sql_print_error("Error: Couldn't repair table: %s.%s",db,name); sql_print_error("Error: Couldn't repair table: %s.%s",db,name);
closefrm(entry); if (entry->file)
closefrm(entry);
error=1; error=1;
} }
else else
{ {
thd->net.last_error[0]=0; // Clear error message thd->net.last_error[0]=0; // Clear error message
thd->net.last_errno=0; thd->net.last_errno=0;
} }
unlock_table_name(thd,&table_list);
if (locked) if (locked)
pthread_mutex_lock(&LOCK_open); // Get back original lock pthread_mutex_lock(&LOCK_open); // Get back original lock
unlock_table_name(thd,&table_list);
if (error) if (error)
goto err; goto err;
} }
......
...@@ -542,7 +542,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -542,7 +542,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
HA_OPEN_IGNORE_IF_LOCKED) | ha_open_flags)))) HA_OPEN_IGNORE_IF_LOCKED) | ha_open_flags))))
{ {
/* Set a flag if the table is crashed and it can be auto. repaired */ /* Set a flag if the table is crashed and it can be auto. repaired */
outparam->crashed=(err == HA_ERR_CRASHED && outparam->crashed=(err == HA_ERR_CRASHED_ON_USAGE &&
outparam->file->auto_repair() && outparam->file->auto_repair() &&
!(ha_open_flags & HA_OPEN_FOR_REPAIR)); !(ha_open_flags & HA_OPEN_FOR_REPAIR));
goto err_not_open; /* purecov: inspected */ goto err_not_open; /* purecov: inspected */
...@@ -569,6 +569,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, ...@@ -569,6 +569,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
frm_error(error,outparam,name,ME_ERROR+ME_WAITTANG); frm_error(error,outparam,name,ME_ERROR+ME_WAITTANG);
delete outparam->file; delete outparam->file;
outparam->file=0; // For easyer errorchecking outparam->file=0; // For easyer errorchecking
outparam->db_stat=0;
free_root(&outparam->mem_root,MYF(0)); free_root(&outparam->mem_root,MYF(0));
my_free(outparam->table_name,MYF(MY_ALLOW_ZERO_PTR)); my_free(outparam->table_name,MYF(MY_ALLOW_ZERO_PTR));
DBUG_RETURN (error); DBUG_RETURN (error);
......
...@@ -31,6 +31,6 @@ ...@@ -31,6 +31,6 @@
char *llstr(longlong value,char *buff) char *llstr(longlong value,char *buff)
{ {
longlong2str(value,buff,10); longlong2str(value,buff,-10);
return buff; return buff;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment