From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25174 invoked by alias); 23 Mar 2015 22:52:19 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 25159 invoked by uid 89); 23 Mar 2015 22:52:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.2 X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Mon, 23 Mar 2015 22:52:16 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id BB76BD3623; Mon, 23 Mar 2015 18:52:11 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id wwqbqr0dEitl; Mon, 23 Mar 2015 18:52:11 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 66E801163E6; Mon, 23 Mar 2015 18:52:11 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id DFCE840EAD; Mon, 23 Mar 2015 15:52:09 -0700 (PDT) Date: Mon, 23 Mar 2015 22:52:00 -0000 From: Joel Brobecker To: Yurij Grechishhev Cc: gdb-patches@sourceware.org Subject: pushed: Re: Setting parity for remote serial Message-ID: <20150323225209.GJ5438@adacore.com> References: <20131004073447.GB3326@adacore.com> <20150225151646.GA30181@adacore.com> <20150227081642.GE31815@adacore.com> <20150317145620.GB7494@adacore.com> <83zj73rain.fsf@gnu.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="OXfL5xGRrasGEqWY" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-SW-Source: 2015-03/txt/msg00760.txt.bz2 --OXfL5xGRrasGEqWY Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 1288 > Updated patch is attached. Thanks! I noticed that there was still a slight indentation error in the calls to internal_warning, so I set about to fix those before committing the patch for you. That's when I noticed that the ChangeLog entries would not apply, and this, combined with enhancing a bit the revision log to include that ChangeLog info, distracted me enough that I forgot to fix the indentation issues! So, attached is: first, the patch that you sent, with the revision log a little augmented to make it a little more descriptive about what the patch brings in; second, the indentation fixes, applied separately, unfortunately. gdb/ChangeLog: * ser-mingw.c (ser_windows_setparity): Fix indentation. * ser-unix.c (hardwire_setparity): Likewise. I pushed the patch for you because I suspect you do not have write permissions in GDB yet, and also to minimize the ping-pong effect. I think you've worked hard on cleaning that patch up already! If you think you might have other changes you'd like to contribute, it might make sense for you to get write-after-approval privileges. If you are interested, send me a private email and I'll get you started (let me know if you have a sourceware.org account already or not). Thanks again for the patch! -- Joel --OXfL5xGRrasGEqWY Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-GDB-Add-set-show-serial-parity-command.patch" Content-length: 17025 >From 236af5e336970a6b58cd17e0a2981bd96f3d09a0 Mon Sep 17 00:00:00 2001 From: Yury Grechishchev Date: Tue, 24 Mar 2015 00:15:42 +0300 Subject: [PATCH] GDB: Add set/show serial parity command. The "set serial parity" command allows the user to control which parity to use when communicating over a serial connection, rather than having the parity hardcoded to none. gdb/ChangeLog: * NEWS: Mention set/show serial parity command. * monitor.c (monitor_open): Call serial_setparity. * remote.c (remote_open_1): Likewise. * ser-base.c (ser_base_serparity): New function. * ser-base.h (ser_base_setparity): Add declaration. * ser-go32.c (dos_ops): Set "setparity" field. * ser-mingw.c (ser_windows_raw): Do not set state.fParity and state.Parity. (ser_windows_setparity): New function. (hardwire_ops): Add ser_windows_setparity. (tty_ops): Add NULL for setparity field. (pipe_ops): Add ser_base_setparity. (tcp_ops): Likewise. * ser-pipe.c (pipe_ops): Likewise. * ser-tcp.c (tcp_ops): Likewise. * ser-unix.c (hardwire_setparity): Add declaration. (hardwire_raw): Don't reset PARENB flag. (hardwire_setparity): New function. (hardwire_ops): Add hardwire_setparity. * serial.c (serial_setparity): New function. (serial_parity): New global. (parity_none, parity_odd, parity_even, parity_enums, parity): New static globals. (set_parity): New function. (_initialize_serial): Add set/show serial parity commands. * serial.h (GDBPARITY_NONE): Define. (GDBPARITY_ODD): Define. (GDBPARITY_EVEN): Define. (serial_setparity) Add declaration. (struct serial_ops): Add setparity field. * target.h (serial_parity): Add declaration. gdb/doc/ChangeLog: * gdb.texinfo (Remote configuration): Document "set/show serial parity" command. --- gdb/ChangeLog | 34 ++++++++++++++++++++++++++++++++++ gdb/NEWS | 4 ++++ gdb/doc/ChangeLog | 5 +++++ gdb/doc/gdb.texinfo | 7 +++++++ gdb/monitor.c | 1 + gdb/remote.c | 1 + gdb/ser-base.c | 8 ++++++++ gdb/ser-base.h | 1 + gdb/ser-go32.c | 1 + gdb/ser-mingw.c | 40 ++++++++++++++++++++++++++++++++++++++-- gdb/ser-pipe.c | 1 + gdb/ser-tcp.c | 1 + gdb/ser-unix.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- gdb/serial.c | 40 ++++++++++++++++++++++++++++++++++++++++ gdb/serial.h | 11 +++++++++++ gdb/target.h | 4 ++++ 16 files changed, 206 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3c59d09..e5e9255 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,37 @@ +2015-03-23 Yurij Grechishhev + + * NEWS: Mention set/show serial parity command. + * monitor.c (monitor_open): Call serial_setparity. + * remote.c (remote_open_1): Likewise. + * ser-base.c (ser_base_serparity): New function. + * ser-base.h (ser_base_setparity): Add declaration. + * ser-go32.c (dos_ops): Set "setparity" field. + * ser-mingw.c (ser_windows_raw): Do not set state.fParity and + state.Parity. + (ser_windows_setparity): New function. + (hardwire_ops): Add ser_windows_setparity. + (tty_ops): Add NULL for setparity field. + (pipe_ops): Add ser_base_setparity. + (tcp_ops): Likewise. + * ser-pipe.c (pipe_ops): Likewise. + * ser-tcp.c (tcp_ops): Likewise. + * ser-unix.c (hardwire_setparity): Add declaration. + (hardwire_raw): Don't reset PARENB flag. + (hardwire_setparity): New function. + (hardwire_ops): Add hardwire_setparity. + * serial.c (serial_setparity): New function. + (serial_parity): New global. + (parity_none, parity_odd, parity_even, parity_enums, parity): + New static globals. + (set_parity): New function. + (_initialize_serial): Add set/show serial parity commands. + * serial.h (GDBPARITY_NONE): Define. + (GDBPARITY_ODD): Define. + (GDBPARITY_EVEN): Define. + (serial_setparity) Add declaration. + (struct serial_ops): Add setparity field. + * target.h (serial_parity): Add declaration. + 2015-03-23 Keith Seitz * linespec.c (linespec_lexer_lex_keyword): Update comment. diff --git a/gdb/NEWS b/gdb/NEWS index bda4a35..3fa33c9 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -3,6 +3,10 @@ *** Changes since GDB 7.9 +* GDB has two new commands: "set serial parity odd|even|none" and + "show serial parity". These allows to set or show parity for the + remote serial I/O. + * The "info source" command now displays the producer string if it was present in the debug info. This typically includes the compiler version and may include things like its command line arguments. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 1f120da..b41c5cb 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2015-03-23 Yurij Grechishhev + + * gdb.texinfo (Remote configuration): Document "set/show + serial parity" command. + 2015-03-18 Gary Benson * gdb.texinfo (General Query Packets): Remove documentation diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 552da31..7117e42 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -19443,6 +19443,13 @@ remote targets. @item show serial baud Show the current speed of the remote connection. +@item set serial parity @var{parity} +Set the parity for the remote serial I/O. Supported values of @var{parity} are: +@code{even}, @code{none}, and @code{odd}. The default is @code{none}. + +@item show serial parity +Show the current parity of the serial port. + @item set remotebreak @cindex interrupt remote programs @cindex BREAK signal instead of Ctrl-C diff --git a/gdb/monitor.c b/gdb/monitor.c index b040ec4..548dae3 100644 --- a/gdb/monitor.c +++ b/gdb/monitor.c @@ -767,6 +767,7 @@ monitor_open (const char *args, struct monitor_ops *mon_ops, int from_tty) } } + serial_setparity (monitor_desc, serial_parity); serial_raw (monitor_desc); serial_flush_input (monitor_desc); diff --git a/gdb/remote.c b/gdb/remote.c index dfa68b3..fd677fe 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -4308,6 +4308,7 @@ remote_open_1 (const char *name, int from_tty, } } + serial_setparity (rs->remote_desc, serial_parity); serial_raw (rs->remote_desc); /* If there is something sitting in the buffer we might take it as a diff --git a/gdb/ser-base.c b/gdb/ser-base.c index 87817c4..09aacec 100644 --- a/gdb/ser-base.c +++ b/gdb/ser-base.c @@ -541,6 +541,14 @@ ser_base_setstopbits (struct serial *scb, int num) return 0; /* Never fails! */ } +/* Implement the "setparity" serial_ops callback. */ + +int +ser_base_setparity (struct serial *scb, int parity) +{ + return 0; /* Never fails! */ +} + /* Put the SERIAL device into/out-of ASYNC mode. */ void diff --git a/gdb/ser-base.h b/gdb/ser-base.h index 6aac925..bb1c51d 100644 --- a/gdb/ser-base.h +++ b/gdb/ser-base.h @@ -43,6 +43,7 @@ extern int ser_base_noflush_set_tty_state (struct serial *scb, serial_ttystate old_ttystate); extern int ser_base_setbaudrate (struct serial *scb, int rate); extern int ser_base_setstopbits (struct serial *scb, int num); +extern int ser_base_setparity (struct serial *scb, int parity); extern int ser_base_drain_output (struct serial *scb); extern int ser_base_write (struct serial *scb, const void *buf, size_t count); diff --git a/gdb/ser-go32.c b/gdb/ser-go32.c index 6bf1b4e..bbcf6af 100644 --- a/gdb/ser-go32.c +++ b/gdb/ser-go32.c @@ -864,6 +864,7 @@ static const struct serial_ops dos_ops = dos_noflush_set_tty_state, dos_setbaudrate, dos_setstopbits, + dos_noop, dos_noop, /* Wait for output to drain. */ (void (*)(struct serial *, int))NULL /* Change into async mode. */ }; diff --git a/gdb/ser-mingw.c b/gdb/ser-mingw.c index 7f335e9..6d383ac 100644 --- a/gdb/ser-mingw.c +++ b/gdb/ser-mingw.c @@ -153,7 +153,6 @@ ser_windows_raw (struct serial *scb) if (GetCommState (h, &state) == 0) return; - state.fParity = FALSE; state.fOutxCtsFlow = FALSE; state.fOutxDsrFlow = FALSE; state.fDtrControl = DTR_CONTROL_ENABLE; @@ -163,7 +162,6 @@ ser_windows_raw (struct serial *scb) state.fNull = FALSE; state.fAbortOnError = FALSE; state.ByteSize = 8; - state.Parity = NOPARITY; scb->current_timeout = 0; @@ -198,6 +196,40 @@ ser_windows_setstopbits (struct serial *scb, int num) return (SetCommState (h, &state) != 0) ? 0 : -1; } +/* Implement the "setparity" serial_ops callback. */ + +static int +ser_windows_setparity (struct serial *scb, int parity) +{ + HANDLE h = (HANDLE) _get_osfhandle (scb->fd); + DCB state; + + if (GetCommState (h, &state) == 0) + return -1; + + switch (parity) + { + case GDBPARITY_NONE: + state.Parity = NOPARITY; + state.fParity = FALSE; + break; + case GDBPARITY_ODD: + state.Parity = ODDPARITY; + state.fParity = TRUE; + break; + case GDBPARITY_EVEN: + state.Parity = EVENPARITY; + state.fParity = TRUE; + break; + default: + internal_warning (__FILE__, __LINE__, + "Incorrect parity value: %d", parity); + return -1; + } + + return (SetCommState (h, &state) != 0) ? 0 : -1; +} + static int ser_windows_setbaudrate (struct serial *scb, int rate) { @@ -1227,6 +1259,7 @@ static const struct serial_ops hardwire_ops = ser_base_noflush_set_tty_state, ser_windows_setbaudrate, ser_windows_setstopbits, + ser_windows_setparity, ser_windows_drain_output, ser_base_async, ser_windows_read_prim, @@ -1257,6 +1290,7 @@ static const struct serial_ops tty_ops = ser_base_noflush_set_tty_state, NULL, NULL, + NULL, ser_base_drain_output, NULL, NULL, @@ -1287,6 +1321,7 @@ static const struct serial_ops pipe_ops = ser_base_noflush_set_tty_state, ser_base_setbaudrate, ser_base_setstopbits, + ser_base_setparity, ser_base_drain_output, ser_base_async, pipe_windows_read, @@ -1317,6 +1352,7 @@ static const struct serial_ops tcp_ops = ser_base_noflush_set_tty_state, ser_base_setbaudrate, ser_base_setstopbits, + ser_base_setparity, ser_base_drain_output, ser_base_async, net_read_prim, diff --git a/gdb/ser-pipe.c b/gdb/ser-pipe.c index bf5e4d4..0700132 100644 --- a/gdb/ser-pipe.c +++ b/gdb/ser-pipe.c @@ -224,6 +224,7 @@ static const struct serial_ops pipe_ops = ser_base_noflush_set_tty_state, ser_base_setbaudrate, ser_base_setstopbits, + ser_base_setparity, ser_base_drain_output, ser_base_async, ser_unix_read_prim, diff --git a/gdb/ser-tcp.c b/gdb/ser-tcp.c index 9c3dcf4..35512e6 100644 --- a/gdb/ser-tcp.c +++ b/gdb/ser-tcp.c @@ -394,6 +394,7 @@ static const struct serial_ops tcp_ops = ser_base_noflush_set_tty_state, ser_base_setbaudrate, ser_base_setstopbits, + ser_base_setparity, ser_base_drain_output, ser_base_async, net_read_prim, diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index 4125797..280fb6a 100644 --- a/gdb/ser-unix.c +++ b/gdb/ser-unix.c @@ -83,6 +83,7 @@ static int hardwire_readchar (struct serial *scb, int timeout); static int do_hardwire_readchar (struct serial *scb, int timeout); static int rate_to_code (int rate); static int hardwire_setbaudrate (struct serial *scb, int rate); +static int hardwire_setparity (struct serial *scb, int parity); static void hardwire_close (struct serial *scb); static int get_tty_state (struct serial *scb, struct hardwire_ttystate * state); @@ -409,7 +410,7 @@ hardwire_raw (struct serial *scb) state.termios.c_iflag = 0; state.termios.c_oflag = 0; state.termios.c_lflag = 0; - state.termios.c_cflag &= ~(CSIZE | PARENB); + state.termios.c_cflag &= ~CSIZE; state.termios.c_cflag |= CLOCAL | CS8; #ifdef CRTSCTS /* h/w flow control. */ @@ -432,7 +433,7 @@ hardwire_raw (struct serial *scb) state.termio.c_iflag = 0; state.termio.c_oflag = 0; state.termio.c_lflag = 0; - state.termio.c_cflag &= ~(CSIZE | PARENB); + state.termio.c_cflag &= ~CSIZE; state.termio.c_cflag |= CLOCAL | CS8; state.termio.c_cc[VMIN] = 0; state.termio.c_cc[VTIME] = 0; @@ -893,6 +894,51 @@ hardwire_setstopbits (struct serial *scb, int num) return set_tty_state (scb, &state); } +/* Implement the "setparity" serial_ops callback. */ + +static int +hardwire_setparity (struct serial *scb, int parity) +{ + struct hardwire_ttystate state; + int newparity = 0; + + if (get_tty_state (scb, &state)) + return -1; + + switch (parity) + { + case GDBPARITY_NONE: + newparity = 0; + break; + case GDBPARITY_ODD: + newparity = PARENB | PARODD; + break; + case GDBPARITY_EVEN: + newparity = PARENB; + break; + default: + internal_warning (__FILE__, __LINE__, + "Incorrect parity value: %d", parity); + return -1; + } + +#ifdef HAVE_TERMIOS + state.termios.c_cflag &= ~(PARENB | PARODD); + state.termios.c_cflag |= newparity; +#endif + +#ifdef HAVE_TERMIO + state.termio.c_cflag &= ~(PARENB | PARODD); + state.termio.c_cflag |= newparity; +#endif + +#ifdef HAVE_SGTTY + return 0; /* sgtty doesn't support this */ +#endif + return set_tty_state (scb, &state); +} + + static void hardwire_close (struct serial *scb) { @@ -929,6 +975,7 @@ static const struct serial_ops hardwire_ops = hardwire_noflush_set_tty_state, hardwire_setbaudrate, hardwire_setstopbits, + hardwire_setparity, hardwire_drain_output, ser_base_async, ser_unix_read_prim, diff --git a/gdb/serial.c b/gdb/serial.c index b7e620d..74567db 100644 --- a/gdb/serial.c +++ b/gdb/serial.c @@ -524,6 +524,14 @@ serial_setstopbits (struct serial *scb, int num) return scb->ops->setstopbits (scb, num); } +/* See serial.h. */ + +int +serial_setparity (struct serial *scb, int parity) +{ + return scb->ops->setparity (scb, parity); +} + int serial_can_async_p (struct serial *scb) { @@ -638,6 +646,30 @@ serial_baud_show_cmd (struct ui_file *file, int from_tty, value); } +/* Parity for serial port. */ + +int serial_parity = GDBPARITY_NONE; + +static const char parity_none[] = "none"; +static const char parity_odd[] = "odd"; +static const char parity_even[] = "even"; +static const char *const parity_enums[] = + {parity_none, parity_odd, parity_even, NULL}; +static const char *parity = parity_none; + +/* Set serial_parity value. */ + +static void +set_parity (char *ignore_args, int from_tty, struct cmd_list_element *c) +{ + if (parity == parity_odd) + serial_parity = GDBPARITY_ODD; + else if (parity == parity_even) + serial_parity = GDBPARITY_EVEN; + else + serial_parity = GDBPARITY_NONE; +} + void _initialize_serial (void) { @@ -670,6 +702,14 @@ using remote targets."), serial_baud_show_cmd, &serial_set_cmdlist, &serial_show_cmdlist); + add_setshow_enum_cmd ("parity", no_class, parity_enums, + &parity, _("\ +Set parity for remote serial I/O"), _("\ +Show parity for remote serial I/O"), NULL, + set_parity, + NULL, /* FIXME: i18n: */ + &serial_set_cmdlist, &serial_show_cmdlist); + add_setshow_filename_cmd ("remotelogfile", no_class, &serial_logfile, _("\ Set filename for remote session recording."), _("\ Show filename for remote session recording."), _("\ diff --git a/gdb/serial.h b/gdb/serial.h index 9eb1c39..add0f15 100644 --- a/gdb/serial.h +++ b/gdb/serial.h @@ -186,6 +186,14 @@ extern int serial_setbaudrate (struct serial *scb, int rate); extern int serial_setstopbits (struct serial *scb, int num); +#define GDBPARITY_NONE 0 +#define GDBPARITY_ODD 1 +#define GDBPARITY_EVEN 2 + +/* Set parity for serial port. Returns 0 for success, -1 for failure. */ + +extern int serial_setparity (struct serial *scb, int parity); + /* Asynchronous serial interface: */ /* Can the serial device support asynchronous mode? */ @@ -271,6 +279,9 @@ struct serial_ops serial_ttystate); int (*setbaudrate) (struct serial *, int rate); int (*setstopbits) (struct serial *, int num); + /* Set the value PARITY as parity setting for serial object. + Return 0 in the case of success. */ + int (*setparity) (struct serial *, int parity); /* Wait for output to drain. */ int (*drain_output) (struct serial *); /* Change the serial device into/out of asynchronous mode, call diff --git a/gdb/target.h b/gdb/target.h index c95e1a4..05dcd9f 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -2236,6 +2236,10 @@ extern int remote_debug; /* Speed in bits per second, or -1 which means don't mess with the speed. */ extern int baud_rate; + +/* Parity for serial port */ +extern int serial_parity; + /* Timeout limit for response from target. */ extern int remote_timeout; -- 1.9.1 --OXfL5xGRrasGEqWY Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0002-Fix-indentation-in-ser_windows_setparity-and-hardwir.patch" Content-length: 1705 >From 2c8f6f16bdd7cc23cbdab1889074c004667555dc Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Mon, 23 Mar 2015 15:42:23 -0700 Subject: [PATCH] Fix indentation in ser_windows_setparity and hardwire_setparity. gdb/ChangeLog: * ser-mingw.c (ser_windows_setparity): Fix indentation. * ser-unix.c (hardwire_setparity): Likewise. --- gdb/ChangeLog | 5 +++++ gdb/ser-mingw.c | 2 +- gdb/ser-unix.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e5e9255..77de88a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-03-23 Joel Brobecker + + * ser-mingw.c (ser_windows_setparity): Fix indentation. + * ser-unix.c (hardwire_setparity): Likewise. + 2015-03-23 Yurij Grechishhev * NEWS: Mention set/show serial parity command. diff --git a/gdb/ser-mingw.c b/gdb/ser-mingw.c index 6d383ac..a6ec374 100644 --- a/gdb/ser-mingw.c +++ b/gdb/ser-mingw.c @@ -223,7 +223,7 @@ ser_windows_setparity (struct serial *scb, int parity) break; default: internal_warning (__FILE__, __LINE__, - "Incorrect parity value: %d", parity); + "Incorrect parity value: %d", parity); return -1; } diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index 280fb6a..356e5e7 100644 --- a/gdb/ser-unix.c +++ b/gdb/ser-unix.c @@ -918,7 +918,7 @@ hardwire_setparity (struct serial *scb, int parity) break; default: internal_warning (__FILE__, __LINE__, - "Incorrect parity value: %d", parity); + "Incorrect parity value: %d", parity); return -1; } -- 1.9.1 --OXfL5xGRrasGEqWY--