Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

su: must be run from a terminal

3,750 views
Skip to first unread message

Hongyi Zhao

unread,
Mar 13, 2017, 10:01:01 AM3/13/17
to
Hi all,

I try to use su to execute some commands with heredoc in my script like
follows:

su root <<EOF
bla
bla
...
EOF

But, when I input the password of root, I meet the following error:

su: must be run from a terminal

And as a result, all of the commands within the heredoc not executed at
all.

How to solve this issue?

Regards
--
.: Hongyi Zhao [ hongyi.zhao AT gmail.com ] Free as in Freedom :.

hymie!

unread,
Mar 13, 2017, 10:13:18 AM3/13/17
to

In our last episode, the evil Dr. Lacto had captured our hero,
Hongyi Zhao <hongy...@gmail.com>, who said:
> Hi all,
>
> I try to use su to execute some commands with heredoc in my script like
> follows:
>
> And as a result, all of the commands within the heredoc not executed at
> all.
>
> How to solve this issue?

Use sudo instead of su. See also
http://stackoverflow.com/questions/10227590/change-user-in-linux-script

--hymie! http://lactose.homelinux.net/~hymie hy...@lactose.homelinux.net

Helmut Waitzmann

unread,
Mar 14, 2017, 1:55:15 AM3/14/17
to
Hongyi Zhao <hongy...@gmail.com>:
> Hi all,
>
> I try to use su to execute some commands with heredoc in my script like
> follows:
>
> su root <<EOF
> bla
> bla
> ...
> EOF

As there is no means to tell su to redirect standard input to file
descriptor #3 after having read the password from standard input
but before executing the shell, the redirection has to be done by
the shell that is executed by su.

As far as I understand one can't tell a shell to redirect file
descriptor #0 to file descriptor #3 and then read commands from
standard input.

But one can tell a shell to redirect descriptor #0 to file
descriptor #3 and then start a new shell.

Assuming, that the root account's shell is a POSIX-conformant
shell,

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
su 3<<EOF

will provide the here document to the su command at file
descriptor #3, thus preserving file descriptor #0 to remain the
terminal. This enables su to ask for the password at file
descriptor #0.

The shell that is spawned from su will now redirect file
descriptor #0 to file descriptor #3, close file descriptor #3, and
start a new shell.

Examples:

Let a root shell read commands from the here document:

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
su optional shell arguments 3<<EOF
bla
bla
...
EOF

Let a root shell execute a command line with standard input
redirected to the here document:

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
su -c ' a_command_line' with optional arguments 3<<EOF
bla
bla
...
EOF

Hongyi Zhao

unread,
Mar 14, 2017, 3:03:29 AM3/14/17
to
On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:

[snipped]
> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> su 3<<EOF

Thanks a lot for your deep-in analysis and wonderful solution.

Still I've some confusions on the above code given by you:

[1] About the `--' used by you here. Based on the manual page of su:

You can use the -- argument to separate su
options from the arguments supplied to the shell.

According the above description, does it means that we should use the
following form in your above code:

su root -- -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
su 3<<EOF

[2] If I use the `-m, -p, --preserve-environment' option, does it means
that the "$SHELL" will not be needed?

[3] If I also use `-' option, based on the manual page of su:

-, -l, --login
When - is used, it must be specified before any username. For
portability it is recommended to use it as last option, before
any username.

What form should I used for your above code?

[4] Why must use two `su' in your code for this type of job?

Regards

[snipped]

Hongyi Zhao

unread,
Mar 14, 2017, 6:37:40 AM3/14/17
to
On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:

> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> su 3<<EOF

Based on your above code, I do the following testing:

Firstly, I created a directory named test with two files in it:

$ find ./test -type f
./test/111
./test/222

Then I put the following code in a script to do the testing:

test-su.bash
-----------
#!/usr/bin/env bash

topdir=$(
cd -P -- "$(dirname -- "$0")" &&
pwd -P
)

cd $topdir

su -- root -p -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
su 3<<EOF
find ./test -type f |
while IFS= read -r line; do
echo "the file under test dir is: $line"
done
EOF
-----------

Then I put the above script in the parent directory of test directory and
run it:

$ bash setup-oh-my-stow.bash
Password:
the file under test dir is:
the file under test dir is:
^C
$

As you can see, in the latter case, the `read' command in the while loop
failed to obtain the output of find.

Any hints for this issue?

Helmut Waitzmann

unread,
Mar 15, 2017, 11:48:48 AM3/15/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:
>
> [snipped]
>> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
>> su 3<<EOF
>
> Thanks a lot for your deep-in analysis and wonderful solution.
>
> Still I've some confusions on the above code given by you:
>
> [1] About the `--' used by you here. Based on the manual page of su:
>
> You can use the -- argument to separate su
> options from the arguments supplied to the shell.

This last sentence does not describe exactly what su actually
does. It's rather a hint for the user how to separate su options
From options that are to be supplied to the shell.

“--” does not tell su, that all following arguments are arguments
supplied to the shell, it rather tells su, that all following
arguments are non-option arguments for su even if they start with
a dash.

For example, should

su -m

start a root shell, preserving the environment, or should it start
a root shell, supplying the option “-m” to it?

It will do the former. To achieve the latter, one could do

su -- -m

A program that conforms to the POSIX Utility Syntax Guidelines
(<http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02>)
treats all arguments from left to right that start with a “-” as
options, until an argument that does not start with a “-” is
encountered. Then this argument and all following arguments are
considered to be operands (even if they start with a “-”).

The special argument “--” tells the utility to stop option
processing even if the following arguments start with a “-”.

Programs, that have been written using the GNU getopt() function
may behave differently:

They treat all arguments from left to right that start with a “-”
as options, as long as there is no “--” argument reached. All
remaining arguments are considered to be operands.

For example,

an “ls” utility conforming to the POSIX Utility Syntax Guidelines, when
called like

ls -log log

will output a long listing (without showing owner and group) of
the file name “log”, whereas

ls log -log

will output a short listing of the file names “log” and “-log”.

An “ls” utility, that has been linked with the GNU getopt()
function, may behave slightly differently:

Called like

ls -log log

it will output a long listing (without showing owner and group) of the
file name “log” as above,

but called like

ls log -log

it will output a long listing (without showing owner and group) of
the file name “log” as well! What's going on there? GNU getopt()
does not stop option processing when encountering an argument not
starting with a “-”.

So to get the intended behavior (the short listing of the two files),
one has to supply the “--” parameter, which tells GNU getopt() to
stop option processing, treating all following parameters as
operands:

ls -- log -log

As this invocation lets behave a GNU getopt() as well as a POSIX
conformant getopt() the same, I use it whenever I want a utility
to stop option processing.

Back to su:

> According the above description, does it means that we should use the
> following form in your above code:
>
> su root -- -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> su 3<<EOF

That might work, if su has been linked with GNU getopt() but fail,
if not: A su conforming to the POSIX Utility Syntax Guidelines
will call a root shell like

sh -- -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su

(which would tell the shell to run the script file “-c” supplying
it the two arguments “exec 0<&3 3<&- && "$SHELL" ${1+"$@"}” and
“su”) rather than like

sh -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su

which is the intended behavior.

In contrast,

>> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
>> su 3<<EOF

will work with a GNU getopt() su as well as with a su conforming to
the POSIX Utility Syntax Guidelines.

> [2] If I use the `-m, -p, --preserve-environment' option, does
> it means that the "$SHELL" will not be needed?

I'm not sure, whether I understand you correctly. My intension
was, that root's shell, as specified by the user database (may it
be bash, ksh or sh for example), should start itself again.
Therefore I tell it to start "$SHELL". According to the su manual
page, the variable SHELL is set by su as specified in the user
database.

But if the -m, -p, or --preserve-environment options are given to
su, then "$SHELL" will specify the invocator's shell, unless the
user to be changed to has got a restricted shell. And this
reusing of the invocators SHELL variable may be bad, calling for
trouble.

So, maybe, it's better to explicitly specify what shell to run,
e.g.:

su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' -su

If you ask me, I recommend to never use the -m, -p, or
--preserve-environment options, as there are environment variables
that call for trouble when simply copied from the invocators
environment, for example HOME, TMPDIR, LOGNAME, USER.

> [3] If I also use `-' option, based on the manual page of su:
>
> -, -l, --login
> When - is used, it must be specified before any username. For
> portability it is recommended to use it as last option, before
> any username.

My su manual page states

“When - is used, it must be specified as the last su option. The
other forms (-l and --login) do not have this restriction.”,

but that's not the behavior of my su (i.e. the manual page is
wrong): The argument “-” is not an option. It's a non-option
argument consisting of a solely “-” (and I guess, it's the same
with your su, despite of the changed manual page).

The behavior of my su is as follows:

First, process all options.

Second, if the first non-option argument is “-”, let the shell to
be started as a login shell and expect in the following argument the
user name.

If the first non-option argument is not “-”, consider it to be the
user name.

That's the traditional way for su to process the “-” argument. If
my su considered “-” to be an option, I would file a bug report.

> What form should I used for your above code?

As I want to be compatible with su in different unices, I don't
use the linux's su specific options “-l” and “--login” but rather
use the “-” non-option argument, which is fairly standard:

su -- - root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' \
-su 3<<EOF

The “-” is the first non-option argument, because “--” explicitly
terminates option processing.

> [4] Why must use two `su' in your code for this type of job?

You are telling the right questions, I see.

In the command

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su

The second su is not a command, it's a copy of the shells
invocation name put after the “-c” “command line” arguments.

There are two things to be explained, here:

If one invokes a POSIX conformant shell (as can be seen in the
SYNOPSIS at
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html>):

sh -c [-abCefhimnuvx] [-o option]... [+abCefhimnuvx] [+o option]...
command_string [command_name [argument...]]

giving it a command line to execute by means of the option “-c”
and the command_string as an argument, one can supply additional
arguments (as one can do when invoking a shell running a shell
script).

But there is a difference between an invocation of a shell running
a shell script and a shell running a command line, for example:

Put this shell script

---CUT-HERE
printf 'argument 0: %s\n%s addtional arguments.\n' "$0" "$#"
test "${#}" -eq 0 || printf '%s\n' "$@"
---CUT-HERE

in a file, e.g. “"$HOME"/script.sh”. Then you can run it,
supplying for example the two arguments “Hello” and “world”:

sh -- "$HOME"./script.sh Hello world

If you want to do the same by means of a command line, you have to
supply an extra argument after the command line before the two
arguments “hello” “world”:

sh -c '
printf '\''argument 0: %s\n%s additional arguments.\n'\'' \
"$0" "$#"
test "${#}" -eq 0 || printf '\''%s\n'\'' "$@"
' sh Hello world

Note the additional “sh” argument following the command line.

I prefer as the additional argument to specify the same as is used
as the invocation name when invoking the shell (see the arg0
parameter in the execl() function
<http://pubs.opengroup.org/onlinepubs/9699919799/functions/execl.html>),
which in this example is “sh”, when calling a shell as above, as
some shells (I don't remember which shell at which unixoid
operating system, maybe HPUX or Solaris it was) used that
additional argument rather than arg0 in determining whether they
should run as a (non-interactive) login shell.

When calling a “sh” by means of “su”, a traditional “su” supplies
as an invocation name (i.e. the arg0 parameter in the execl()
function)

* “su” (rather than “sh”), when calling a non-login sh, and

* “-su” (rather than “-sh”), when calling a login sh.

The intension of using “su” rather than “sh” is to let the called
sh test its special parameter “$0” (for example in the startup
files) to behave differently when called by “su”.

Therefore I prefer to run that same command line when invoking via
su as a non-login shell as

su -- root -c '
printf '\''argument 0: %s\n%s additional arguments.\n'\'' \
"$0" "$#"
test "${#}" -eq 0 || printf '\''%s\n'\'' "$@"
' su Hello world

and when invoking via su as a login shell as

su -- - root -c '
printf '\''argument 0: %s\n%s additional arguments.\n'\'' \
"$0" "$#"
test "${#}" -eq 0 || printf '\''%s\n'\'' "$@"
' -su Hello world

Helmut Waitzmann

unread,
Mar 15, 2017, 11:49:14 AM3/15/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:
>
>> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
>> su 3<<EOF
>
> Based on your above code, I do the following testing:

[…]

> su -- root -p -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> su 3<<EOF
> find ./test -type f |
> while IFS= read -r line; do
> echo "the file under test dir is: $line"
> done
> EOF

[…]

> run it:
>
> $ bash setup-oh-my-stow.bash
> Password:
> the file under test dir is:
> the file under test dir is:
> ^C
> $

You discovered the difference between

“some_command <<EOF
$line
EOF”

and

“some_command <<'EOF'
$line
EOF”:

In the former case, text like “$line” in the here document is
parameter-expanded by the shell that processes the “<<EOF”
redirection. In the latter case, it's used verbatim. (See also
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04>
for the whole story.)

To test that, compare the command

---CUT-HERE
line="What's going on here?"
cat <<'EOF'
find ./test -type f |
while IFS= read -r line; do
echo "the file under test dir is: $line"
done
EOF
---CUT-HERE

with the command

---CUT-HERE
line="What's going on here?"
cat <<'EOF'
find ./test -type f |
while IFS= read -r line; do
echo "the file under test dir is: $line"
done
EOF
---CUT-HERE

Hongyi Zhao

unread,
Mar 15, 2017, 7:24:41 PM3/15/17
to
On Wed, 15 Mar 2017 16:48:38 +0100, Helmut Waitzmann wrote:

> So, maybe, it's better to explicitly specify what shell to run,
> e.g.:
>
> su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' -su
^^^^^
Do you mean:

su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' su
^^^^
Regards

Hongyi Zhao

unread,
Mar 15, 2017, 7:40:26 PM3/15/17
to
On Wed, 15 Mar 2017 16:49:09 +0100, Helmut Waitzmann wrote:

> To test that, compare the command
>
> ---CUT-HERE line="What's going on here?"
> cat <<'EOF'
> find ./test -type f |
> while IFS= read -r line; do
> echo "the file under test dir is: $line"
> done EOF ---CUT-HERE
>
> with the command
>
> ---CUT-HERE line="What's going on here?"
> cat <<'EOF'
> find ./test -type f |
> while IFS= read -r line; do
> echo "the file under test dir is: $line"
> done EOF ---CUT-HERE

Both you above two tests using: 'EOF', so it must be your typo.

One should using 'EOF' and the other using EOF.

Thanks a lot.

Hongyi Zhao

unread,
Mar 15, 2017, 7:49:02 PM3/15/17
to
On Wed, 15 Mar 2017 16:48:38 +0100, Helmut Waitzmann wrote:

> When calling a “sh” by means of “su”, a traditional “su” supplies as an
> invocation name (i.e. the arg0 parameter in the execl()
> function)
>
> * “su” (rather than “sh”), when calling a non-login sh, and
>
> * “-su” (rather than “-sh”), when calling a login sh.

I inspected my su's manual page, it doesn't have any descriptions you
given above at all.

I use the su which shipped with Debian Jessie the you can see the info of
my os:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.7 (jessie)
Release: 8.7
Codename: jessie

Regards

Helmut Waitzmann

unread,
Mar 15, 2017, 8:11:08 PM3/15/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Wed, 15 Mar 2017 16:48:38 +0100, Helmut Waitzmann wrote:

>> So, maybe, it's better to explicitly specify what shell to run,
>> e.g.:
>>
>> su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' -su
> ^^^^^
> Do you mean:
>
> su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' su

Yes. Thank you for the correction.

Helmut Waitzmann

unread,
Mar 15, 2017, 8:38:03 PM3/15/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Wed, 15 Mar 2017 16:48:38 +0100, Helmut Waitzmann wrote:
>
>> When calling a “sh” by means of “su”, a traditional “su” supplies as an
>> invocation name (i.e. the arg0 parameter in the execl()
>> function)
>>
>> * “su” (rather than “sh”), when calling a non-login sh, and
>>
>> * “-su” (rather than “-sh”), when calling a login sh.
>
> I inspected my su's manual page, it doesn't have any descriptions you
> given above at all.

Yes. Not all “su” in all unices do that.

To examine, what your su will do, you could run the command

su -- "$LOGNAME" -c '"$@" "$$" && :' sh ps -o args

to get a non-login shell running ps, and

su -- - "$LOGNAME" -c '"$@" "$$" && :' -sh ps -o args

to get a login shell running ps.

Helmut Waitzmann

unread,
Mar 15, 2017, 8:42:13 PM3/15/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Wed, 15 Mar 2017 16:49:09 +0100, Helmut Waitzmann wrote:
>
>> To test that, compare the command
>>
>> ---CUT-HERE line="What's going on here?"
>> cat <<'EOF'
>> find ./test -type f |
>> while IFS= read -r line; do
>> echo "the file under test dir is: $line"
>> done EOF ---CUT-HERE
>>
>> with the command
>>
>> ---CUT-HERE line="What's going on here?"
>> cat <<'EOF'
>> find ./test -type f |
>> while IFS= read -r line; do
>> echo "the file under test dir is: $line"
>> done EOF ---CUT-HERE
>
> Both you above two tests using: 'EOF', so it must be your typo.
>
> One should using 'EOF' and the other using EOF.

Oh, sorry. You are right. One should use “<<'EOF'” and the other
should use “<<EOF”. (Both of them should use “EOF” in the last
line of the script.)

Hongyi Zhao

unread,
Mar 15, 2017, 10:41:03 PM3/15/17
to
On Thu, 16 Mar 2017 01:37:57 +0100, Helmut Waitzmann wrote:

> Yes. Not all “su” in all unices do that.

Why does they -- the developers of these tools -- let things like this?

This will make the tool more difficult for user, like me, to use it.

>
> To examine, what your su will do, you could run the command
>
> su -- "$LOGNAME" -c '"$@" "$$" && :' sh ps -o args
>
> to get a non-login shell running ps, and
>
> su -- - "$LOGNAME" -c '"$@" "$$" && :' -sh ps -o args
>
> to get a login shell running ps.

If so, maybe the only way to know the details of this feature is based on
inspecting of the source code.

Hongyi Zhao

unread,
Mar 16, 2017, 1:32:10 AM3/16/17
to
On Wed, 15 Mar 2017 16:48:38 +0100, Helmut Waitzmann wrote:

> As I want to be compatible with su in different unices, I don't use the
> linux's su specific options “-l” and “--login” but rather use the “-”
> non-option argument, which is fairly standard:
>
> su -- - root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' \
> -su 3<<EOF
>
> The “-” is the first non-option argument, because “--” explicitly
> terminates option processing.

I do the following testings based on your above codes:

$ ls
setup-oh-my-stow.bash stow_dir test
$

$ su -- - root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' \
-su 3<<EOF
ls
EOF
Password:
$


$ su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' \
-su 3<<EOF
ls
EOF

Password:
setup-oh-my-stow.bash stow_dir test
$

As you can see, the former form, i.e., the one your suggested here, will
give nothing when feeding the `ls' command to it. While the latter form
which doesn't use the the `-' symbol just before the username, will run
the `ls' command correctly.

Why does this happen?

Regards

Hongyi Zhao

unread,
Mar 16, 2017, 2:25:23 AM3/16/17
to
On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:

> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> su 3<<EOF

Another issue is when using the above form, I can obtain the variables
value defined outside of the heredoc; while using the delimiter form
<<'EOF', it will prevent the variable expansion and I won't be able to
obtain the variables value defined outside of the heredoc, see my
following testings:

$ aa=123
$ su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<
\EOF
echo $aa
EOF
Password:

$ su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
echo $aa
EOF

Password:
123
$

So, my issue is: is it possible for me to ensure meta-characters are not
expanded for certain part of the heredoc and at the meanwhile, let me can
obtain the variables value defined outside of the heredoc in my script,
if required?

Hongyi Zhao

unread,
Mar 16, 2017, 2:33:47 AM3/16/17
to
On Wed, 15 Mar 2017 16:48:38 +0100, Helmut Waitzmann wrote:

> So, maybe, it's better to explicitly specify what shell to run, e.g.:
>
> su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' -su

If you want use this form, why use the ``-s'' option of bash:

------------- begin excerpted from bash's manual page ---------------
-s If the -s option is present, or if no arguments remain after
option processing, then commands are read from the standard
input. This option allows the positional parameters to be
set when invoking an interactive shell.
------------ end excerpted from bash's manual page ------------------

Based on the above description, what about change your above code into
the following form:

# you have clarified that `-su' should be `su' here:
su -- root -c 'exec 0<&3 3<&- && bash -s' su

Regards

>
> If you ask me, I recommend to never use the -m, -p, or
> --preserve-environment options, as there are environment variables that
> call for trouble when simply copied from the invocators environment, for
> example HOME, TMPDIR, LOGNAME, USER.





Hongyi Zhao

unread,
Mar 16, 2017, 2:38:39 AM3/16/17
to
On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:

> Assuming, that the root account's shell is a POSIX-conformant shell,
>
> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> su 3<<EOF

Does the same trick also applied to the `sudo' utility? I mean, can I
also use the similar form as follows for my job:

sudo -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
sudo 3<<EOF

Hongyi Zhao

unread,
Mar 16, 2017, 3:12:38 AM3/16/17
to
On Thu, 16 Mar 2017 06:25:20 +0000, Hongyi Zhao wrote:

> So, my issue is: is it possible for me to ensure meta-characters are not
> expanded for certain part of the heredoc and at the meanwhile, let me
> can obtain the variables value defined outside of the heredoc in my
> script, if required?

After some tries on this issue, I think the most feasible way should be
the following:

$ aa=123
$ su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
# this should be expanded:
echo $aa
# this shouldn't be expanded:
bla \$some_other_var
EOF

Helmut Waitzmann

unread,
Mar 17, 2017, 3:25:12 AM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Thu, 16 Mar 2017 01:37:57 +0100, Helmut Waitzmann wrote:
>
>> Yes. Not all “su” in all unices do that.
>
> Why does they -- the developers of these tools -- let things like this?

I don't know.

> This will make the tool more difficult for user, like me, to use it.
>
>>
>> To examine, what your su will do, you could run the command
>>
>> su -- "$LOGNAME" -c '"$@" "$$" && :' sh ps -o args
>>
>> to get a non-login shell running ps, and
>>
>> su -- - "$LOGNAME" -c '"$@" "$$" && :' -sh ps -o args
>>
>> to get a login shell running ps.

What will the following two commands output, when you run them on
your system?

su -- root -c '
ps --cols=66 -o comm=FILE -o args "$$" &&
printf '\''"$0"%s\n'\'' "${0+=}${0- undefined}"' \
sh

su -- - root -c '
ps --cols=66 -o comm=FILE -o args "$$" &&
printf '\''"$0"%s\n'\'' "${0+=}${0- undefined}"' \
-sh

They show (by means of the command “ps”) the name of the
executable file of the running shell (column FILE), and the
invocation parameters (column COMMAND) given to it. Also the
shell special parameter “$0” (last line of output) is shown.

On my system I get

Password:
FILE COMMAND
bash bash -c ? ps --cols=66 -o comm=FILE -o args "$$
"$0"=sh

and

Password:
FILE COMMAND
bash -su -c ? ps --cols=66 -o comm=FILE -o args "$$"
"$0"=-sh

respectively.

* If a non-login shell (in this example: a bash, see column FILE)
is started by su, su supplies to the shell the invocation name
“bash” (see column COMMAND).

* Whereas, if a login shell (in this example, a bash) is started
by su, su supplies to the shell the invocation name “-su” rather
than “-bash”.

> If so, maybe the only way to know the details of this feature is based on
> inspecting of the source code.

If one wants to be absolutely sure, yes.

Helmut Waitzmann

unread,
Mar 17, 2017, 3:26:51 AM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:

> $ ls
> setup-oh-my-stow.bash stow_dir test
> $
>
> $ su -- - root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' \
> -su 3<<EOF
> ls
> EOF
> Password:
> $
>
>
> $ su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' \
> -su 3<<EOF
> ls
> EOF
>
> Password:
> setup-oh-my-stow.bash stow_dir test
> $
>
> As you can see, the former form, i.e., the one your suggested here, will
> give nothing when feeding the `ls' command to it. While the latter form
> which doesn't use the the `-' symbol just before the username, will run
> the `ls' command correctly.
>
> Why does this happen?

On my system, “su” not only has got a manual page but also an info
page:

info su

There is one strange thing: The contents of the info page differs
From that of the manual page.

From the info page:

`-'
`-l'
`--login'
Make the shell a login shell. This means the following.
Unset all environment variables except `TERM', `HOME', and
`SHELL' (which are set as described above), and `USER' and
`LOGNAME' (which are set, even for the super-user, as
described above), and set `PATH' to a compiled-in default
value. Change to USER's home directory. Prepend `-' to the
shell's name, intended to make it read its login startup
file(s).

“Change to USER's home directory.” Therefore the “ls” command
to be executed will get root's home directory as the current
working directory.

Helmut Waitzmann

unread,
Mar 17, 2017, 3:46:31 AM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Wed, 15 Mar 2017 16:48:38 +0100, Helmut Waitzmann wrote:
>
>> So, maybe, it's better to explicitly specify what shell to run, e.g.:
>>
>> su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' -su
>
> If you want use this form, why use the ``-s'' option of bash:

I'm not sure, if I understand you correctly. Do you mean the last
word, “-su”, of the command?

su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' -su

This command will start a non-login root shell, giving the following
parameters to it:

The invocation name of the shell will be the shells executable
file name with all leading directory components removed, that is:

If root's shell is a “/bin/bash”, the invocation name will be
“bash”. If root's shell is a “/bin/sh”, the invocation name will
be “sh”.

(See my posting from 2017-03-17T08:24:35+0100
<news:87d1dge...@helmutwaitzmann.news.arcor.de> with message
id <87d1dge...@helmutwaitzmann.news.arcor.de>.)

The first argument given to that shell will be “-c”, the second
one given will be “exec 0<&3 3<&- && bash ${1+"$@"}”, and the
third one given will be “-su”:

"$shell" -c 'exec 0<&3 3<&- && bash ${1+"$@"}' -su

The first option in the shell's argument list is “-c”. The next
argument “exec 0<&3 3<&- && bash ${1+"$@"}” is a non-option
argument, because it does not start with a hyphen. So option
processing stops here. Therefore the third argument “-su”,
although starting with a hyphen, is not considered by the shell to
be the options “-s” (read commands from standard input) and “-u”
(treat the expansion of unset shell variables as an error). It is
merely the parameter called “command_name” in the invocation
synopsis

sh -c [-abCefhimnuvx] [-o option]... [+abCefhimnuvx] [+o option]...
command_string [command_name [argument...]]

of the shell (see
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html>)
or the shell's manual page.

> ------------- begin excerpted from bash's manual page ---------------
> -s If the -s option is present, or if no arguments remain after
> option processing, then commands are read from the standard
> input. This option allows the positional parameters to be
> set when invoking an interactive shell.
> ------------ end excerpted from bash's manual page ------------------
>
> Based on the above description, what about change your above code into
> the following form:
>
> # you have clarified that `-su' should be `su' here:
> su -- root -c 'exec 0<&3 3<&- && bash -s' su

Of course you can do that, if you like.

But my intension was to provide a general means of “read the su
password from standard input, then redirect file descriptor #3 to
standard input and start a shell”.

Using this idiom, one can

* let that shell read commands from standard input by supplying
the option “-s” to the shell:

su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' su \
-s optional positional parameters

* let that shell read commands from a shell script:

su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' su \
a_shell_script.sh optional positional parameters

* let that shell read a command line via an option “-c”:

su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' su \
-c 'a command line' bash optional positional parameters

The “bash ${1+"$@"}” part of the root shell's command line lets
the root shell start a bash, supplying it all remaining su
parameters.

This freedom to use it one way or another is not given, if one
hardcodes the “-s” in the invocation of the bash:

su -- root -c 'exec 0<&3 3<&- && bash -s' su

But YMMV.

Helmut Waitzmann

unread,
Mar 17, 2017, 3:58:07 AM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
Yes. You can do

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
-s \
zero or more variable/value pairs -- \
optional positional parameters \
3<<\EOF
while test -n "${1+defined}"
do
case "$1" in
?*)
if test -z "${2+defined}"
then
printf >&2 \
'%s: missing value for variable %s\n' \
"$0" "$1"
exit 1
fi
eval "${1:?}="'"${2?}"'
shift 2;;
--)
# end of variable list: stop processing variables
shift; break;;
'')
printf >&2 \
'%s: The null string is not a variable name.\n' \
"$0"
exit 1;;
esac
done
# all variable value pairs have been processed
EOF

Example:

aa=123
su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
-s aa "$aa" bb ';cd /;rm -Rf "$HOME"' -- \
3<<\EOF
while test -n "${1+defined}"
do
case "$1" in
?*)
if test -z "${2+defined}"
then
printf >&2 '%s: missing value for variable %s\n' \
"$0" "$1"
exit 1
fi
eval "${1:?}="'"${2?}"'
shift 2;;
--)
# end of variable list
shift; break;;
'')
printf >&2 \
'%s: The null string is not a variable name.\n' \
"$0"
exit 1;;
esac
done
echo $aa $bb
EOF

Notes:

Ad-hoc variables can be supplied, too, as can be seen with
variable “bb”: Variable “bb” will be defined by the "$SHELL" that
will execute the contents of the here document, even if it isn't
defined in the shell that is processing the “<<\EOF” redirection.

Even variables, whose contents look dangerous, can be supplied
without harm, as can be seen with variable “bb”.

Helmut Waitzmann

unread,
Mar 17, 2017, 4:14:42 AM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Thu, 16 Mar 2017 06:25:20 +0000, Hongyi Zhao wrote:
>
>> So, my issue is: is it possible for me to ensure meta-characters are not
>> expanded for certain part of the heredoc and at the meanwhile, let me
>> can obtain the variables value defined outside of the heredoc in my
>> script, if required?
>
> After some tries on this issue, I think the most feasible way should be
> the following:
>
> $ aa=123
> $ su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
> # this should be expanded:
> echo $aa
> # this shouldn't be expanded:
> bla \$some_other_var
> EOF

Beware! What will happen, if you do the following command?
(Don't run it, or you will need your backup!)

$ aa=';cd;rm -Rf'
$ su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
# this should be expanded:
echo $aa
# this shouldn't be expanded:
bla \$some_other_var
EOF

Or rather than start a "$SHELL" by the means of that dangerous

If you want to see, what that dangerous command would do, if you
ran it, just “cat” standard input by replacing the dangerous “su”
command line above

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF

by

su -- root -c 'exec 0<&3 3<&- && cat' su 3<<EOF

and run it. This will just print the commands rather than let a
shell execute them.

For a safe way to import variables, see my posting
<news:871stwe...@helmutwaitzmann.news.arcor.de> with message
id <871stwe...@helmutwaitzmann.news.arcor.de> from
2017-03-17T08:57:37+0100.

Helmut Waitzmann

unread,
Mar 17, 2017, 4:38:41 AM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:
>
>> Assuming, that the root account's shell is a POSIX-conformant shell,
>>
>> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
>> su 3<<EOF
>
> Does the same trick also applied to the `sudo' utility? I mean, can I
> also use the similar form as follows for my job:

Sudo differes widely from su, so the command

> sudo -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> sudo 3<<EOF

won't work.

As sudo opens „/dev/tty” on its own to read the password, it does
not use standard input to do that. Therefore there is almost
never any need to supply the standard input for the shell via file
descriptor #3: One can just use standard input.

The command

su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su \
-s 3<<EOF

would roughly correspond to the command

sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh \
-s <<\EOF

to let a login shell start a "$SHELL" that reads commands from
standard input.

The command

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
su -s 3<<EOF

hasn't got any equivalent with sudo, as it is impossible to let
sudo set the environment variable “SHELL” to the target user's
shell (as specified in the user database) without starting a login
shell (if I understand correctly).

(But I think, that's no deficiency, because setting up a proper
environment by means of a login shell is almost always a good
idea.)

With sudo, you /can/ supply the password via standard input and
the payload data via a different file descriptor, though (for
example, if you want to supply the password not via the terminal
but via a pipe), if you use the sudo options “-S” and “-C” (see
the manual page sudo(8)) and have specified the
“closefrom_override” or “closefrom” options in the file
“/etc/sudoers” (see the manual page sudoers(5)).

Helmut Waitzmann

unread,
Mar 17, 2017, 4:41:47 AM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Thu, 16 Mar 2017 06:25:20 +0000, Hongyi Zhao wrote:
>
>> So, my issue is: is it possible for me to ensure meta-characters are not
>> expanded for certain part of the heredoc and at the meanwhile, let me
>> can obtain the variables value defined outside of the heredoc in my
>> script, if required?
>
> After some tries on this issue, I think the most feasible way should be
> the following:
>
> $ aa=123
> $ su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
> # this should be expanded:
> echo $aa
> # this shouldn't be expanded:
> bla \$some_other_var
> EOF

Beware! What will happen, if you do the following command?
(Don't run it, or you will need your backup!)

$ aa=';cd;rm -Rf'
$ su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
# this should be expanded:
echo $aa
# this shouldn't be expanded:
bla \$some_other_var
EOF

If you want to see, what that dangerous command would do, if you
ran it, just “cat” standard input by replacing the dangerous “su”
command line above

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF

Hongyi Zhao

unread,
Mar 17, 2017, 9:09:58 AM3/17/17
to
On Fri, 17 Mar 2017 08:46:26 +0100, Helmut Waitzmann wrote:

> Hongyi Zhao <hongy...@gmail.com>:
>> On Wed, 15 Mar 2017 16:48:38 +0100, Helmut Waitzmann wrote:
>>
>>> So, maybe, it's better to explicitly specify what shell to run, e.g.:
>>>
>>> su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' -su
>>
>> If you want use this form, why use the ``-s'' option of bash:
^^^^^
Sorry for my typo in the above sentence, I just want to say the following:

If you want use this form, why not use the ``-s'' option of bash:
^^^^^^^
>
> I'm not sure, if I understand you correctly. Do you mean the last word,
> “-su”, of the command?

No, I mean changing your code into the following:

su -- root -c 'exec 0<&3 3<&- && bash -s' -su

>
> su -- root -c 'exec 0<&3 3<&- && bash ${1+"$@"}' -su

Regards

Hongyi Zhao

unread,
Mar 17, 2017, 10:00:41 AM3/17/17
to
On Fri, 17 Mar 2017 09:41:42 +0100, Helmut Waitzmann wrote:

> For a safe way to import variables, see my posting
> <news:871stwe...@helmutwaitzmann.news.arcor.de> with message id
> <871stwe...@helmutwaitzmann.news.arcor.de> from
> 2017-03-17T08:57:37+0100.

Why not post you reply directly to this group?

In addition, I use Pan 0.141, it seems it can't directly locate/open your
above message based on the message id your applied here.

I then searched on the google and find the following website which can do
the ``Usenet Article Lookup'' based on the message id:

http://al.howardknight.net/

Hongyi Zhao

unread,
Mar 17, 2017, 10:04:34 AM3/17/17
to
On Fri, 17 Mar 2017 14:00:38 +0000, Hongyi Zhao wrote:

>> For a safe way to import variables, see my posting
>> <news:871stwe...@helmutwaitzmann.news.arcor.de> with message id
>> <871stwe...@helmutwaitzmann.news.arcor.de> from
>> 2017-03-17T08:57:37+0100.
>
> Why not post you reply directly to this group?

Sorry, I see your reply on this thread later then I see the above notes
by you.

Hongyi Zhao

unread,
Mar 17, 2017, 10:30:48 AM3/17/17
to
On Fri, 17 Mar 2017 09:38:37 +0100, Helmut Waitzmann wrote:

> The command
>
> su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su \
> -s 3<<EOF

Perhaps I don't understand your purpose correctly here; but based on your
above code, I do the following testing:

$ su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su -s 3<<EOF
ls
> EOF
Password:
$

As you can see, it doesn't execute the ``ls'' command at all.

>
> would roughly correspond to the command
>
> sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh \
> -s <<\EOF

Also, see my following testing on my Debian Jessie with your above code:

$ sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF
ls
EOF
stdin: is not a tty
$

Why?

>
> to let a login shell start a "$SHELL" that reads commands from standard
> input.

Barry Margolin

unread,
Mar 17, 2017, 12:06:45 PM3/17/17
to
In article <oactvr$6h3$1...@aspen.stu.neva.ru>,
Hongyi Zhao <hongy...@gmail.com> wrote:

> On Thu, 16 Mar 2017 01:37:57 +0100, Helmut Waitzmann wrote:
>
> > Yes. Not all “su” in all unices do that.
>
> Why does they -- the developers of these tools -- let things like this?
>
> This will make the tool more difficult for user, like me, to use it.

Different Unix implementation have different sets of developers. When
one developer decides to add a new feature, it doesn't get into all the
other distributions, and you end up with divergence.

Sometimes things get back into sync when the other developers notice a
feature that they like, and they copy it into their version as well. But
that takes time, so they'll never be completely the same.

Other times, different developers make changes that are incompatible
with each other. These are hard to reconcile.

The most notorious case is the "ps" command, which had very different
arguments on BSD and AT&T Unix. They've managed to be reconciled
somewhat, because the AT&T options didn't begin with "-" while the BSD
options did (or something like that).

--
Barry Margolin, bar...@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***

Casper H.S. Dik

unread,
Mar 17, 2017, 1:10:03 PM3/17/17
to
Barry Margolin <bar...@alum.mit.edu> writes:

>The most notorious case is the "ps" command, which had very different
>arguments on BSD and AT&T Unix. They've managed to be reconciled
>somewhat, because the AT&T options didn't begin with "-" while the BSD
>options did (or something like that).

Vice versa (ucb ps did not require a leading "-" and AT&T did require
that.

So these days when you use "ps uxga" on Solaris you'd get BSD behaviour
and when you use "ps -ef" you'd get SVr4 behaviour (and ps -uxga will give
you an error that xga is an unknown user)

Casper

Hongyi Zhao

unread,
Mar 17, 2017, 7:11:08 PM3/17/17
to
On Fri, 17 Mar 2017 08:25:01 +0100, Helmut Waitzmann wrote:

> On my system I get
>
> Password:
> FILE COMMAND bash bash -c ? ps --cols=66 -o
^^^
I don't get the `?' for my case.

> comm=FILE -o args "$$
> "$0"=sh

See my testing:

$ su -- root -c '
ps --cols=66 -o comm=FILE -o args "$$" &&
printf '\''"$0"%s\n'\'' "${0+=}${0- undefined}"' \
sh
Password:
FILE COMMAND
bash bash -c ps --cols=66 -o comm=FILE -o args "$$
"$0"=sh

>
> and
>
> Password:
> FILE COMMAND bash -su -c ? ps --cols=66 -o

I don't get the `?' for my case.

> comm=FILE -o args "$$"
> "$0"=-sh

See my testing:

$ su -- - root -c '
ps --cols=66 -o comm=FILE -o args "$$" &&
printf '\''"$0"%s\n'\'' "${0+=}${0- undefined}"' \
-sh
Password:
FILE COMMAND
bash -su -c ps --cols=66 -o comm=FILE -o args "$$"
"$0"=-sh

>
> respectively.

Helmut Waitzmann

unread,
Mar 17, 2017, 7:11:36 PM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Fri, 17 Mar 2017 09:38:37 +0100, Helmut Waitzmann wrote:
>
>> The command
>>
>> su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su \
>> -s 3<<EOF
>
> Perhaps I don't understand your purpose correctly here; but based on your
> above code, I do the following testing:
>
> $ su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su -s 3<<EOF
> ls
>> EOF
> Password:
> $
>
> As you can see, it doesn't execute the ``ls'' command at all.
>

Perhaps your directory is empty?

Please try the following command:

$ PS2='? '
$ su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su -s 3<<\EOF
? ls -d -- "${HOME%/}"/
? EOF
Password:
/root/

>>
>> would roughly correspond to the command
>>
>> sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh \
>> -s <<\EOF
>
> Also, see my following testing on my Debian Jessie with your above code:
>
> $ sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF
> ls
> EOF
> stdin: is not a tty
> $
>
> Why?
>

Hm. That differes from the behavior of my sudo:

$ PS2='? '
$ sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF
? pwd
? EOF
[sudo] password for helmut:
/root

Would you send me your sudo(8) and sudoers(5) manual pages, please?

Hongyi Zhao

unread,
Mar 17, 2017, 7:20:33 PM3/17/17
to
On Fri, 17 Mar 2017 08:25:01 +0100, Helmut Waitzmann wrote:

> su -- root -c '
> ps --cols=66 -o comm=FILE -o args "$$" &&
> printf '\''"$0"%s\n'\'' "${0+=}${0- undefined}"' \
> sh

Why you use this complex variable expansion method in the above code:

"${0+=}${0- undefined}"

Hongyi Zhao

unread,
Mar 17, 2017, 7:40:00 PM3/17/17
to
On Sat, 18 Mar 2017 00:11:05 +0100, Helmut Waitzmann wrote:

> Perhaps your directory is empty?

Yes, It only have dot-files in the directory:

$ sudo ls -la /root/
total 40
drwx------ 7 root root 4096 Mar 11 23:17 .
drwxr-xr-x 22 root root 4096 Mar 11 12:40 ..
-rw------- 1 root root 1481 Mar 16 17:23 .bash_history
-rw-r--r-- 1 root root 570 Jan 31 2010 .bashrc
drwx------ 3 root root 4096 Mar 11 22:54 .cache
drwxr-xr-x 5 root root 4096 Mar 11 23:05 .config
drwx------ 3 root root 4096 Mar 11 22:54 .dbus
drwxr-xr-x 3 root root 4096 Mar 11 22:54 .local
-rw-r--r-- 1 root root 140 Nov 20 2007 .profile
drwx------ 3 root root 4096 Mar 16 21:09 .synaptic
$

>
> Please try the following command:
>
> $ PS2='? '
> $ su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su -s 3<<\EOF
> ? ls -d -- "${HOME%/}"/
> ? EOF Password:
> /root/

This time I get the same result as yours:

$ PS2='? '
$ su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su -s 3<<\EOF
? ls -d -- "${HOME%/}"/
? EOF
Password:
/root/


>
>
>>> would roughly correspond to the command
>>>
>>> sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh \
>>> -s <<\EOF
>>
>> Also, see my following testing on my Debian Jessie with your above
>> code:
>>
>> $ sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF ls EOF
>> stdin: is not a tty $
>>
>> Why?
>>
>>
> Hm. That differes from the behavior of my sudo:
>
> $ PS2='? '
> $ sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF ? pwd ?
> EOF [sudo] password for helmut:
> /root

See my results:

$ PS2='? '
$ sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF
? pwd
? EOF
stdin: is not a tty
/root

>
> Would you send me your sudo(8) and sudoers(5) manual pages, please?

See here:
https://gist.github.com/hongyi-zhao/465d8fd038197cd2dedb54b57a9de5e0
https://gist.github.com/hongyi-zhao/ef3c5dd65c45740a20169a4825815470

Hongyi Zhao

unread,
Mar 17, 2017, 8:03:24 PM3/17/17
to
On Fri, 17 Mar 2017 23:39:58 +0000, Hongyi Zhao wrote:

> This time I get the same result as yours:
>
> $ PS2='? '
> $ su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su -s 3<<\EOF
> ? ls -d -- "${HOME%/}"/
> ? EOF Password:
> /root/

But, when I using su's ``-p'' option, I still obtain the same result as
above:

$ echo $HOME
/home/werner


$ PS2='? '
$ su -- - root -p -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su -s 3<<\EOF
? ls -d -- "${HOME%/}"/
? EOF
Password:
/root/

Based on the manual page of my su:

---------------------
-m, -p, --preserve-environment
Preserve the current environment, except for:

$PATH
reset according to the /etc/login.defs options ENV_PATH or
ENV_SUPATH (see below);

$IFS
reset to “<space><tab><newline>”, if it was set.

If the target user has a restricted shell, this option has no
effect (unless su is called by root).

Note that the default behavior for the environment is the
following:

The $HOME, $SHELL, $USER, $LOGNAME, $PATH, and $IFS
environment
variables are reset.
-------------------------

I wonder why the current $HOME, i.e., /home/werner for my case, can't be
preserved when using the ``-p'' option.

Helmut Waitzmann

unread,
Mar 17, 2017, 9:05:49 PM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Fri, 17 Mar 2017 08:25:01 +0100, Helmut Waitzmann wrote:
>
>> On my system I get
>>
>> Password:
>> FILE COMMAND bash bash -c ? ps --cols=66 -o
> ^^^
> I don't get the `?' for my case.

I assume, the “?” stands for the newline character in the command
line, but that doesn't matter.

> See my testing:
>
> $ su -- root -c '
> ps --cols=66 -o comm=FILE -o args "$$" &&
> printf '\''"$0"%s\n'\'' "${0+=}${0- undefined}"' \
> sh
> Password:
> FILE COMMAND
> bash bash -c ps --cols=66 -o comm=FILE -o args "$$
> "$0"=sh

The bash (column FILE) has been invoked by su with the invocation
name “bash” (column COMMAND; see the parameter “arg0” in the
synopsis of the library function execlp() in
<http://pubs.opengroup.org/onlinepubs/9699919799/functions/execlp.html>).

[…]

> See my testing:
>
> $ su -- - root -c '
> ps --cols=66 -o comm=FILE -o args "$$" &&
> printf '\''"$0"%s\n'\'' "${0+=}${0- undefined}"' \
> -sh
> Password:
> FILE COMMAND
> bash -su -c ps --cols=66 -o comm=FILE -o args "$$"
> "$0"=-sh

The bash (column FILE) has been invoked by su with the invocation
name “-su” (column COMMAND; see the parameter “arg0” in the
synopsis of the library function execlp() in
<http://pubs.opengroup.org/onlinepubs/9699919799/functions/execlp.html>).

Helmut Waitzmann

unread,
Mar 17, 2017, 9:21:22 PM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Fri, 17 Mar 2017 08:25:01 +0100, Helmut Waitzmann wrote:
>
>> su -- root -c '
>> ps --cols=66 -o comm=FILE -o args "$$" &&
>> printf '\''"$0"%s\n'\'' "${0+=}${0- undefined}"' \
>> sh
>
> Why you use this complex variable expansion method in the above code:
>
> "${0+=}${0- undefined}"

to get a shorter command line ;)

If the positional parameter $0 is undefined, "${0+=}" yields the
empty string, and "${0- undefined}" yields the string
“ undefined”. So the command

printf '"$0"%s\n' "${0+=}${0- undefined}"

prints the line “"$0" undefined”.


If the positional parameter $0 is defined, "${0+=}" yields an
equal sign, and "${0- undefined}" yields $0's value. So the
command

prints a line consisting of “"$0"=<value of $0>”.

An alternative would have been the command

if test -n "${0+defined}"
then
printf '"$0"%s\n' "=$0"
else
printf '"$0"%s\n' ' undefined'
fi

Helmut Waitzmann

unread,
Mar 17, 2017, 9:46:35 PM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
They are unusable for my manual pages browser.

Would you please

run the command

man --location -- 8 sudo 5 sudoers

and send me the named files?

Helmut Waitzmann

unread,
Mar 17, 2017, 10:13:13 PM3/17/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Fri, 17 Mar 2017 23:39:58 +0000, Hongyi Zhao wrote:
>
>> This time I get the same result as yours:
>>
>> $ PS2='? '
>> $ su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su -s 3<<\EOF
>> ? ls -d -- "${HOME%/}"/
>> ? EOF Password:
>> /root/
>
> But, when I using su's ``-p'' option, I still obtain the same result as
> above:
>
> $ echo $HOME
> /home/werner
>

I'll not test this on my system, as I consider running a login
shell without resetting the HOME environment variable to the
target user's home directory an unsane thing to do:

For example, let root run a login shell with HOME set to my home
directory will cause the login shell to read the “.profile” in
/my/ home directory rather than in root's. Also, if the login
shell writes a history file, the history file will be written to
my home directory. As it is written by a root process, it will be
unaccessible to shells running as my user id because of lack of
permissions.

Sorry, I won't shoot me in my foot.
Maybe, because of the risk of shooting oneself in the foot.

Hongyi Zhao

unread,
Mar 18, 2017, 4:02:48 AM3/18/17
to
On Sat, 18 Mar 2017 02:46:31 +0100, Helmut Waitzmann wrote:

> Would you please
>
> run the command
>
> man --location -- 8 sudo 5 sudoers

$ man --location -- 8 sudo 5 sudoers
/usr/share/man/man8/sudo.8.gz
/usr/share/man/man5/sudoers.5.gz

>
> and send me the named files?

Could you please tell my email and I can send them to you.

Helmut Waitzmann

unread,
Mar 18, 2017, 3:34:29 PM3/18/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Sat, 18 Mar 2017 02:46:31 +0100, Helmut Waitzmann wrote:

> $ man --location -- 8 sudo 5 sudoers
> /usr/share/man/man8/sudo.8.gz
> /usr/share/man/man5/sudoers.5.gz
>
>>
>> and send me the named files?
>
> Could you please tell my email and I can send them to you.

Maybe the changelogs in “/usr/share/doc/sudo/” might tell anything
about tty or terminal?

Here you are:

Helmut Waitzmann Anti-Spam-Ticket.b.qc3c <oe.th...@xoxy.net>

My reply-to address is valid, that is, you may just reply by e-mail to
this posting.

Hongyi Zhao

unread,
Mar 18, 2017, 6:28:42 PM3/18/17
to oe.th...@xoxy.net
On Sat, 18 Mar 2017 20:34:01 +0100, Helmut Waitzmann wrote:

> Maybe the changelogs in “/usr/share/doc/sudo/” might tell anything about
> tty or terminal?
>
> Here you are:
>
> Helmut Waitzmann Anti-Spam-Ticket.b.qc3c <oe.th...@xoxy.net>
>
> My reply-to address is valid, that is, you may just reply by e-mail to
> this posting.

Done, see them in attachments.

Hongyi Zhao

unread,
Mar 18, 2017, 6:29:01 PM3/18/17
to
=ybegin line=128 size=9244 name=sudo.8.gz
Iµ2*****,-ˆÖïπ=M‡º'Ê$?Ó.„  » f P%Ïî ìM óÒ‹ë<ä™™‡íÖìɸ≤ºgË‚i® k|æñ°‹!+ ±√‡W≥V@’x«T¿0Iâ/≠πŸÓóàFıé›◊Óˇ Ñ & Ì·ß" ˘g&"ß) aôË 3") =J
=M˜·"ÓȈ b@·-=[¬Œ”TÔ© !+©#… à¡ø¸\E÷ ©=M ^Û~øÂn N˘nøµÑ’»ÇÎÊg€ı=Mé7©è@µb˚ √V t≥î≈íÀ üü∫œ< ÊÆE∏^|{¡oÿøbNˇÄÍ "aŸU€ÄtÍ]Ö ‘ {ñt√ T ≥Ã
ˆ!s÷åB{Ä …<ú√ ?7flúU˘ TÉS<¨êXDõ œÃz‹>sPéƒ Ω≥¸-·Ê#'rnΩÂ#±ö`<=MrvëΩ!=M íRàØ;¶©OÏ—K >X !Ω√B∏Õ ±ö&B≥ kÍ}› ìhHo^ ±=[&àˆp ÏCf]´ÒäÍê —
±Ôö& ∏»FixIZw]¨¬ ˚JπÕ g&>ËGi∂ È∫*°=M#˝R¥0Z≤¢ƒ≤˚%˚˝Ün!b∫Q ª¢B±ôIp ò\Հϗân^G ∏̱H≤hE ¯•Z∞'.˘ x»Ã˚y5B9 ;Ì [¶±Ãˆ { ø †I¯Õ3ˆf≠?pµ
±cÿ ò`£>9Ω2ØAµí.ΩÆ :I1g¨˙{9»E´≤]æf¶åÀò =MÛ=}h+Ω˘ëKt ^§!Z®a§‰G Ì=}§åh√Î∑µÚf˙=} ñF ÷ΩÔ Tïl-ÌbyMHø‡*ü,¸∫FÕCR=M[Œª Ö\äõ∞ Ò; .áG≥S÷ê
ñ~9ioµ •Õ±íÃL˘ûà¨ó¨ ?‹÷.BXÑ z◊ 0PH•√◊=J$vìZˡÄvı&afl‘^y„{ Rÿ∞ ñDàΩ=[∞sS < ˇg * àÙTYÎÛ è`;É”\{SJÍò1y!äfl áy˛É6àWaœ|eø´ù˛ÂO&ö!˜9
Á#‰)Ì9'≈(≈ òË`5C xWıÑ¿qõmz´R[÷ä˜Ì≥"hBvfi≤ bAa≠ 1aô¥ô¨kfi?y =MRBf Æug!{Ôs/âåÀh’?,´.âM Æ˛⁄ÓF }L®æ^v ı˝éD∑M!¶Z‚uÔÄ& &2)» % œgÚ}2"
:hëª'VoÇ¥ ÇR%Ì0© æ£á â‡"ı` ø'ÀÍI*܆Ø%”…Ç^©Ù …b Ã√ n∞3 ôfi ≥éÆÉ∏ › è£ò=[1 £%ßo≠œ| Èy <©T ˛w~üëhÉÏ%öP»fi"Y&9Ë èÑÂ≈=} åßì◊ñv©j#)÷Ô§u
3 ä±Õ †`»LÚ^Ö,;Oi™üù ”Jò˚mBS«E=J2ò´=J4≤=}‰∞1 x¥π∑ô ˙ÉûÀÄÛd´Î6÷íB‘v‘çz ì‹d¨)xµp2B÷Úı¥Ór 70d™πŒ,‚”w2‡-2D*,Jãxº?ü DlZ&3¸¶-πò0ζ≈æ[À
D ·º√≤ˇàœ£õD ? |®Ú¢˛MáIÈ» À∂^DflõÚıë∫l |œü§é8*-^’Ç¡cJ¿ÙåæjÎ∆ïÉ— q M:ØäZ\p|îÍ…Ì`+÷ÆÚÈÙ›ü‹”;ø!≥NÁ◊=}fi=@”>Ÿ fl§ f-DÎÖH∞ û:nt€N˚ë[è≥-¬
fll4´‰ +˙≠‘=J=Mx π÷'„·WÄ‡Ç í0C“ ™∆œRΩgr⁄{‰Qº_ J à`∫◊˛+“œ÷›0u£ ê÷«f¥|ß‘Ω|[+ÏÒä î:_-àM£-†Ñœ•∆9 S≠,6I~G%ê g¨u ”ˇÄê≥ 7¨=[‰•;˛íP∑Eé98j
:λΩ4Å´§oÉË,ÿèë≠Òä\ fÇi“IØkUûÖL¡⁄9 ‹}LwÍwÚ^©ë£Ûßç ’) c÷+‚s k/8-PE=J=@˙‡_=@:∆[¿dÕì~ˆ @«b,T ¢∫Ç´ “73jLÎØÍ∞ãΩÚÛ ‰Â @Ú∑v |20ºFfiÈP[
GÌè« öóß˝∏·Ää.Ò ˚#∆fDQ2093n *v6&yçÊq°<Í¥ı\≥ Ä⁄˝ä ù =MeZ‘·qæa≠ 'Gfl qª_YzDë∆ ü;E=}çã ¿ZòãföE .’$Ì¿ ˘4Sj5 Î1 ÙˆXÿåœÅ*W2•*a± H
p‹U¸ -‚´´ÅUzÔ‰x3Ø=@<&8ê/n0≈˚Pù=[á7óimfi‹¬ l∫HW ÿ¯÷5V»:=}ë2B_ì(œl;`fitõzì J.Y7 @ÊÇ H|Ê"!ä `?'tòn)∫Ó⁄?°j_?oe˚=}ß”…˚ ≠QÓ∆^gL¶^≈ëfæ
b1 z3ú˝|ÛBÈ*∆ ¶âèéºS◊ h>˝y,÷˘¯ë†L=[l:DÔ?ŒódÉ–æ∆?™·\Á∞ûW/ïqŸÆI° îP Ô“ó<=MF~=J B è!ef≠| 4ò∫œÁ—ª†fiQÑ$ïB'b7ÕRz h´≤k^°Yı.K∞.Å?SÌX
j≈ì˙ ì4M¢ä.I.=}nÛm¨≥Wî ¢˘*∑k¶AÍ…tå:Ω™Å√\=MH3DZOè˜É_ B’≥ ®V *T*%/ 8BTÎ∆? ©V$SÍ|3z˝˘ ï:Ö¶≈/â≤”ª˛8 Äùj¡ fl flXâ)¶ù]% èºÁ=@§ VëZ¥Û2k
ßÉ ø< N!=JL“fi›b˘ N=}™U£c⁄‡„n ÜÙˇ]¸S ´É«ª<`ÛHÜ §©Ïi`!7Í∏U=}ÔB [ÇB≈|aØ∞ø– ·¶≥òÇ+˘Ó5Zä|˛SJ{˙∂±ıjë±Á/ùSU sËôi,·-[zÂ:!Ù¥–£u:FFQ´€jÈ
ä J‡·fiáHU·òu\ã# ◊Ètù◊$ äH„o<§µÅ“ˆ™ˆmZ ?∫Îì FØsEîKÌ 6hV{4,x¶†”=@r^ ≥2}◊ ≠=Jg =}.v.•D  l¥q“l‘fi ΩÍ .¯ Ëÿ∆ñ⁄=J ~jP5^‰ùl¨Âà SÛ± ôéLÍ°
䈛‹…Mtvò∫rÿTIO \s=[`ç<~˙ãv‰BS 6 ∏?  ÀÊ´·Ö5íNG„ï6J≤6@˝îNãÍÉ˙3åqOrw‚·Èƒ“î=MΩ›∞;§k+ ’úŸ$™mÎbµ≥∫ì5[ ‰4@ØÅ̓W E {6ø0 ˝ŒËù=J–â|O:'ˆ#
’˘¸.Rµ'óU!TRÑÔf©§©x·~ØuœÜñÆke1&›ÆB 1=MÀÿ: k ∏4^Öi¯*] ∑ÅOmöP°¥çUòh 'Ù\¨Å≤5≤æÊÉ™+D∂BsıCØ ⁄Íuv¬@ è ¡Pè E£X8ÂbGrÖz^8T#÷\=}≤?$‡mãܶZ1
∫¡ÇC ¨K# x=@ˈ$k≥:'{®m• DŒn:äöZç9Ó¨ö®æ°Í=}ñ#cv¯‰ »çŸ“~ÙO{%¢œ‹å/^)oŸ“_1ËPò∏∞=M#é∞ D" 'bÑÆ9+è øŸ«7”ÑÜ;»≠'læÄ ™m4ÑÏ$ ˚ªŸ`≠Õ(R`›
tá„íæ¨ˇUEaí_÷¬`Ω Ú31~˛L≈Ϊ∂E†,6±‘¸≥èöxâêÈz4 ˙¬ÍHß˙é€è‹k§.v¯ŒlÜ{ ±*f˙∏˜øî1*´å∂|¥fi5 ù´˛fi,~ÃÊ ^≥°–”πÂO®nå=[÷Cœ˚}¡¥JÑÔPyl4™€E‹ ∂˜
* ≠ .‡Çë» LG {$µ≥@ÿ≥_ˆ6È©*k≤[ÔjNÅÇåÆJç¡¡=} .ötú‘é Ò(˜Èî#ß'7 ¥Ì>pìµ .æ5x [d´ˆœ}Æfl Ç €Zy†YcÄ ´œUŒT ;F–V∞;j`ÜA>flÃ⁄ ÃB¬=[g≠›L3ö´
IG3sÏÚˇW’+∑Õc)ó„ ʼn/ÒüêW6gÀÒˇø¶±0K_ zw˛omœ=Jl ∂˝SÛ5Ã√ZäC Z¿ˇ çnƒ,˚âSŒY|FéÛ=Jî∂¸f±ÒJ¿ Z5œGò≠Æ- –:ê¢6© R6ÅÛV’›¶¯”/6å±®Í˘[Ê;ß ÊÇ
ö X+õ “T –1 O„æDÌ{Øps" –Z ¿t‚⁄ã l/9 {∫™Ÿˆ =MK ˛Q=[8(¨ ÷Ω˘Hp1≠…|=[o⁄ t ≤Z øDñ0æä©=[∞î5 ¬¢-öqì söÕƒ` ˝m∏§é ‘ ?≈êDæÉŸéã/∫Æhdø§u
LÏwIøZ˙t˛œh…µfl!Øá*w æ?eõ0 Ÿ{ˇtî=}° åÒ ò–öÄùπ>*X!·ä Î6=@1» :ƒXGÀ´v „…f∏¯ ì`=}mÈõ2 a Úz+ÑƱÉQ Q ê ®sì”*‚<Y€ L;ê≠ãõ>»∫⁄ÕÇ;ÏIÔ8™
áò∆ Zêw ö–ÍñF∑h§®pfl ÿ≈C «<í] xm ‰‘`ü5Å'Ô≤~_„∏9≥ d√£˛ T6ܨ\˝–<ê7(é˙„ˇ”v_ªI ñ3[‡ ∂ı–◊ |îwC˛±À ÓJ {ÅI?–ƒë ÌüeüP‚eì8<eœõ‹¢ÎäÓı0=}
∫ ¸¢f∏áæº√êß˚oÅπÓ=J¿ ¢^Ò=[ ’W?fi–|6™Óz¬o‰¨ Éx ≈2≤`( ÜÇ¢îú ¿°≈îR≤◊åëñfi¸_?9RÂٛͿ· ŃfiÊúì4—& ë∫ÉUY Î=}ó9U∫¯‚‹–ÅeÌ¥€fl© õâΩÍÑıÀî∏
Ÿ õ€@=}@9Hû‹u|É ø-Ò6vk ∫ ìVÜbŒ7¨Ø^ ∆≠¥{]∆’ Öà LΩöa õË‘=[ê܈ÎÉñåWÄÿ ¢ê ˜πörh†∫Q \ FSÒîê∞5ú¿'MÑ`]Ûh@∂+Ɇo:fl j<gÂ<◊$Ê|o ¥S&⁄ Ω
] Ñ&Ö‘ ≤∂…∆ ˙ˆµË ÷56πU-wH º 0jñ ïTº.i~òbg•‰Üò°ƒ£ê˜ä=Jì>mÀ¬ùn}©†ú Z Û^≥c7©sE>A£wR“ ‚¬”˘¶‡˙Lö>ÖEJì ƒ˘r(⁄`RpF:¢ ¬ß≈9?éäπ5´ ˘ w–ÿ
„¿UGË˙ 1]”Ÿæ r÷fCRp =[∏¬,Èæ øá¢ÔU A˘=[*N 飔®y˘K,Wñ √îæcˆ[—PÄuÅ: Zfl ∏ÀXF´ú˝Æu√Ê˝¥A kü'áÄ√ƒ™∏㈺_ ö·Øfl+ÔdTd√ ¥xP úsq_ wúåπ‹Ñ w
Ü√∫râ‰À∏zããz º1=}Òw"6+P+‡u∏‰¶® ‘VnTƒß oAe÷Ê>Ú˝˙ ,≈û∆öÁ C<¬O¿A7M „ÜtQYîsB ñ∏˘YOıæ˘=@ì§ ç æCºâˇ!öbê8±ÕÕ,ñ÷c‰•⁄∫I* ä Ò≤£ÉÍèwgê†=}
â“¿MY÷îó¥)∫/ bÂÛ:˜‹f •Îa2!£åy_ õ, _ƒ-I^ ûíVÍPåmF&MÅ L¿f =[3èÅ˛ |ÖÖPfifi ÆÈxÖ?xt2ûZ µØ 6√Ω∞g[+ˆ§}d2òøÕYooºWÛ<û‚ Yf¶ïb›ÎéÓ :@±p H?
+ão˛ æŸ√ù*% =MjoõF„≠˜6+ K çüÃqØ4áO.4?…d~’ó˙Kæxeà·≤´- Ôç"–√éÀ”7‘=@?*¢!J≈ JÛ'jv¯9k,r⁄‹ø◊ `øu ∫?‹DΩX®CûI=Jè⁄u§Zõà ˝ÌÒŸ]ÑDŒËâ 1 ù+Dï
"Q XæãQ T◊çï”õx/1‰úØ*Ïè!GK–L† H˛ „Ï£ÿ ¯ … ˆy† ü§≤ß . »2≤Ô◊˛≈˜|≠∏∫òÆ é.ÿI¢/ Ì@€ˆ°flœ é≤‹âj»Uö∞Ï|mÑp√ õ 4 ¯¬7ß D 8G| :÷}„˚Y÷ =M…
ËÜ∆É=M ¡ ú_J‚\òq Gè›Á,`†"/0t F _Ùÿy. $ßM¬• ı d ~È—ûè˘_∫Y≈|µ◊Ï–”V¬‡JG, …ó¸Ω≈á£øú2=Mr=@© VıF¸ö˙bÏ ∆dDVºŸö†ë%œÓ^¶ñìèÓπ }˜=[9 ¬3U¶
~Æ≈ flJcäö7ú0@ Õ14˛e°‡‰0∫F∑Hº÷( .hf/Oxtv…¶9å=[ì≥™êõ\n~ÿ”Íw≠9Z∂\_I ∆ æYb4 : fi ”¯‡9. ›j)Í—=@@5ñô´S ƒhPe˛8†7WΩ€∂Às, h˙£‰ ì·.wu͈=[°¸
ßh®‚IgfÜ 0Ç≈∂D[ÔÆÚ5Mü $å◊ )• ¯Tû«√< Õë≥˛k#9·nƒè=J=[åƒ fi™ìıöûid¿Tãc∑˜ªsÂfl‚pÉ›@Ù $ ≠·L ˆÑ&…u{–L ÀröD˜]üu⁄d ˇ g x˜£ò˝ ”È •#z ¿<
¢}ƒé80 §*ñmZßa „N=J s‰{ñ { Éø†∑Æîë ‚ 5fi`flãvÎ ◊ïñâú+|Üa?߉ÕÖ˙—ªy # ›S Y(‡ú( Üc èäfi÷Ôi‚ƒIãßv…óÉù@,ù|MíoæÕü<§4lA Ô¬48Ï ¯∫uM ¨Saºw
›ŒÔM0b.™— ª‰⁄@‰ÛÆ~fi]ëä ;Ú˜˚@Œ9sÄfle®˜O 4äƒ Ép îËhÅ0ö7˘íƒ⁄õwi…†g, ÷ƒ 8ÂMÖŒØ∞!´â=[⁄„<œ `{ ⁄ ü4|΢ufij"è«Œ¶Rä%…{u†nî»⁄ ‹ ‘Ù=@ªv
 ˝ »fiìtÜÎ 9>f§◊ò}YÌÓ=}Øvã5øÓ¬†°–Ω¿oaflJ*©Øภg˝±ï L^ —åöü I ˚w´÷¯&hªizΩcŘãÁ S Ωfl –I1#à˝RÈœd\∫ÚÏ ∫£RÍ'ßàÉÍ|˘˚ Ë2ò'jî˚wÈ'˝;`√Jô
ÕR˜é¶=}W™∏ YÊY+c.å Òi; £B($Z®e5ëÈ&d7 ! ò õÒòjÙ∞àA˘≈ ì‹> cê _•x<¯F¡"®<¡L ÉË8ºGË›°”Xçv&LZ√{fl—·A ⁄Œ3˝3â2ÆÆ∂Ñã˘°p√~Dü¥Q ÍÇ’™ ¿|c Ä
?`ñ«–≈◊Å4dfl>Ω óWĨªqÕ# ß™sfiqXE-“ÚÜ=[á/∏¸êzlJîbÅW}lÚ ]∏ `Õ\ç`fll§sÀù¨õ ˇÆíUòQππ"¸=J ˚ ¨ Å#˙,SmAflâgiÖ ïfl˙`.=@ ≠∏ ≠KF5 9xwÛ v3∞æ™i
õW∞àDCƒ /ImΩ(vr^‚ ˚¥¯U\¡lܢˇWÖˇNdÆ€ÔP , ∂ªôfi-*ßì—ˆ}AL¶+ÿ≈òôŸÑ-fé—R _>—øúû^ót\ıdw oßw¡˛∞F & – ãˆCòtŸ*`q'r^ Ñ!Vµî ¢Î pñµÔ_‚Ωg‰tßU˛
ómYª [‡Ì ëõ =MI‘C.`ù ææfiyôîÀj 9üt‘·LÜ%ø¶0∞±∑jÆù ∂·ªÅO;ƒìºfiçÂ=J≤WÂwZ`*ÅM Ççm =JïäqÑ̓ֆ Ñfl˛Ã£ ™ U A√ìZ°à≤˘ K1 ‰,à› ‡ P”ïn v*uw
#∑ÉÓk|çT.◊fiØ;≤P C‡”\£{˙Ú›aŸFzØ æ¿˘·¡å — flw§ñoÅ% cfi Ù Ê[ˇû∑†09Ê∞`}),9‘§∆Ï5{í/ı <*;=J Q{*oufió˘å®∞m (5∑Äq v¨å9ºNÈ5ÜQ≈6˘Z¡‘dR˝ 
æQö'‹Z≈ï∑l” • zÍ~ ˆ∆E]◊Sœ m Ëëñíó_–!v xá%g:Ñç—sÍO=}7fÀ∑ßIv [”d«d. uÔ ™ ˝s^(√ÙP"LàZ*Ø è+”æú`èd»r§EF"ñ˚F¨ëëˇé8 ñïG!'¬«ó}êq™Ã;3ä
M4Ñpæ ŒıAâ5=M F' \úzyÁuÀ˚£ ?N —+ü´àŒ8pvÿ ãh ¿›[†dú!6F ¯ûüÕø† !ï˘Ø '‘?«‹ú‘'”l–C"ô ¬;ÁÿƒΩ;ñ” IÏ•˛ÕÌ®sºıí˝ õj=JA˚h,fé[ ≠ó ^DzÙR
ée eòˇ S†W x≥]O clE Ä=@AfÚ¢i =@∆ 6!LDÈÂâv€,¯âyùÄ3©'ì=[Èœáïô ;'¯âkB5÷ Ù<,û´äAÇÍsø∑{i.u8‡…,tÃV=@< ãÒ'⁄ÈÁù õIŒ ü ysF ı%ƒ√] ∂˘A≥
ò=[Sπ3ÃÉ =M›d,èUbK≈g!oœnñ ßà¡#X¸ 69∆®âb» 3 0ì…ë{ cŸˆfiµ§»xiÑ&XMH£=@πfi`âÜ˘Ï˘%Òc•£’÷~òÔT z…lÿœÿsm§Ÿß†© # Oı¨ ∏Ôc¸&åˬÉ& ≥E†‰Ãk=[
£¢ÿd=@C 5Á‡,=J¸YèV∆´M]Êi§%Ú◊≈ u È Î‰oÖ—ˇgÖƒÊ ª√=MgP^±ˇ‘j∂1A\ÁY"¸* ` óí„u Ccmá u. ˜òåJï·Äµ ˜èL∆5z yWy=Jén+¿Oác\=}· ~2&à =}L/
àê"yã)\É΄ > 5∆ã˘ wÑ˚ˇ>◊∑RÚùZ…éˇ\Ó– ] J˘Hè¸  ò› û∑∑,YL9ìĺù˚⁄Æ?y‚ ¨˛“Lâ⁄ ∆0UÍ -N√'ïÕÈ«<€IWÖT√äi ∏iDˆ VÓfiª™£U|O£ˇ%¶ò wY⁄ _
^ +fi%˚ö1√äÀò0kr—¯Û}é·∏C åêñ‹Ï:=J \ Ë#fi2Ô6L≥t`C˜"]-Ûîfiƒ ®\ï∫F’ƒG¡; òhµ6 ± π-çˇ { î •\8Œ©m˘yò áø◊ù nñû·Fö·≥˜oç∂'≠;qï(x[f“‘g[ã⁄
ˆıfCB∫¢∑ y ËR ˙>d±∆=M2? ˘,BX¥Ó¢≠z™X9N¸7ÖÓHë˙ӠωÑÍtc ŸvMØ=}˘OW ¥¿Uç±Ñ´π=Mà [™t '3¡LjBÍú =Je∑%ë}›N Ñ yèüöÜ” s‚´ Òkéé Ê È=}ÇıÍe⁄
ΩkX[ÓO?% Ÿr fl=@m Ùp‚\4Á€S˝<∏ d— D ⁄ÆØC"õ#: ΩÿœŸ‰U ±ó À9.õá9ähz7m:º µ ı Ô ^„ß: ˇ˛=MhÜ>ˇƒ {R∞ı w∫vã-◊‰M≈±9esÆ2»Óàê{ ∏8÷°êl÷0
Õ–Cf›rá$dA µ’›™´yfü:ÿJ„»•3 ¶’ œÆëW¸ \oº≥1ä+µ¶jh¥}4Û ∞Ì flh∆Ñ@å —VT˜4#)À∆: ˇÏGf5 ™¢\ˆ3ZÒÓ∑Ëů8÷ Ò=M Çήyq∏omD=J§#[J> \)∞t¨∫ èæ≤S
∏ï5≠$«πyÓ7z…v˛z9z=@t;PÔUÅoÁ ¬AÒ õÏNDË≤∞N Q∞=Märdc\6^≈ BK ¥˚ó Ôı,Ï_˜z=@flˇË ägníâd*˜h}PcÀ¡ïaÁí:QR ∏ê§≈jA˙ø^˛ˇ@´∂FÀ# =M 7îéááY–k
?QÉp/Ò›w Å0M¡zÌ; º,∞˘TQöùX m ª#„5x-eKw§^h ˘edtπ¡ Ñäà uù„y·“QfiØì‰cuMèfl ¬˙x•¨ »u∂∂t˘úQÉ«•∑à ıΩ O¡SÅ ˆ·!lÔ,Ënö\vÅ bª,æΩ„è Áeé W\.ü
èdë .`Få Á ˛Ø¡‰< ˘´v ù m˙—˝Üƒå[, ÌL‹YFo^áÃøt …Ö=Jõ |¢îgo»ê&ã? Û€⁄˙QM¶ûúˇŒi8ˆ∫ =Jøè=@=@«æeú«≤öü›k º•∫ÓW’Ñø˜¿ £>OäM =@˙ë4ÎÆm…Î ”d
r2sáØ∫3˜¨¸ãœd≤ Í =@8≠ÎÍ sÕ--=M ë mX¯ïOfi ;áÛ:NUfl∞Ôˆú¸ H·ÜQÃ-∞º Ùπaú¥ ií˘@≈ À— ÿyúf=@ zU!*ˆÆ9ƒ›\=[2^—} =[=[ ™ØHª°Û‹[y´`( ∞ïCÑI]
£¸ &=M ∂X>Ÿ B>fi AúÂ_ xª∫œC§“ÑÛ<l˙æ¡wÎ=M5± —jÉá*m ü·©2 ¿∫£=J懻ê≠ g` L”{+j=J«+5ÅY{  gz"É á›¯¡«* (à’]æ.B=[«8˘¸l° ¶ô¢ §ù~4% â ?y
=J+÷ ∞Ï &_Y‡Å∑ j_ºÃnBxòáe kƒ°_p =J#Gx~wŸË∆ Üâá¸0 ùk]∂˛v˝} ©qs.´=@/@/µY‚∑Øı~‡ê?Gˆ»Ó 9§6 °i3o=@ı )ÿ%m?Ót›Îê ºpÒÄ=@=Jn|O∆öYNqHï Ω|ü
‘ƒ¡∆ ‰ÂfeÈJëvès ¿Ä :À¶#"ø \+ cˆë0ø2 “ß,ı‰e∫ÉùÁ‹úù SÁ∞ô‹°SÙ”ƒ) É.)à7;πÄÎ=@ñ!æga*uÈ‹Ê˛ú™≠Y⁄4M¿¥eÇ‘R_*=@fl°bÎ hΩ˜ œ.úk7◊Ì”ò!¿Z8ô
_ã îË”´; g• ˚r' ã?Õ#ÎToÉÈ‚º˘∏ ¢ƒˆ “f+]V =Mùd| ˙æÔÕ¸Óõ‚ [‚MÒe§ ©d9õ=}:í1áщ‹yÛ†flÓ∞≠¬ Üâ¯@‹PtI§À¶Ü Á#e •˛œ:i∑(GuÃÉœYõ¡ ‡R8n∑ Ê∑È
p˝‡ =[[· w Ï5 AE ÈIH˝=MiÕ¨qìóìyY– Ë=[0aárRΩÜ `'û®´ ÀŸr"≈ ·m™äÇX\8®áÌ˝ ˘XëíE #˘ßçLCg:ubµ¡#\zkx äˇw‹=M°∂•€?ü.y¯‹ú∫fi∏ îÊòá©: † n
«‰,Ñ+Ä◊Ñ ojÅG ÔÊ‹˘ © B ≥GwÅ0n;˘óflç3ÒI¢ Ù`®}˜rPñ˝a7#fi=MXì íTF”?’ã¶1YßEô '¯„G‹•…» 7gtàï$1'c ‡ îˇv¨Ä≠∏Iµ&Û∫ᆌ/◊êI T∑=[(ÒØP8ú ÙlO¶
Êóv°¢k‰≈∫Ylı†aÀ® πöb∆œU Ê˙±)’ EºmªHÔNönç6ô«<fiÆ{z*}=[ ˙9P7 ÑïÈfl J*z—∂z«=[–xF⁄ßÑ—©ß!}§ ÿÇ U(ß> ™ÊcÒ∞∫º/ ã2d πPÊ©„‰÷¬Ô⁄t´¢ı{Ä“;
⁄¬lŸ}ëä„uÕå◊NI˘Âµx◊ä‚r5Å '"󅃻ÿ¸ÕˇÑÒ 5„ ìΩ(//¥´˛»=@è$UTñ)`ˇYë&烻ሟˇ w K=[ JF'1E…_/WÕËùF&nσ˚: 6®Ä vHflIg@f !fº˘ ù‰á)ìò‚'ÖêÓl™
J ª ÁÜõù ‡9iyPû‹f‡—∞Ÿ 3W. .Ï3e{fiés’‚s ©⁄Íîûí.|®®xÿ~≥Ññ?ŒÕF<ç7B— -ö8#ù»ˇ˜Y‹  Øî“*Î.Æ+Ç;˛SîÎ∂ }¨NÙ¸ò˛d=Mº≈Á_∑©Îkinª¨ Iòì¨ )˘.õ¢
´—‘‰3ë≥ ôÖ4˛c=J^Ôï26`˘¥•√«‰R)4 ¡ å∏Úp=Já™πÉm[ã ÷o b b∞K>~ øN√9Ïœñr@ÚMß?P˃ è˚îØ›- *∑ ñ ~t≤Å…—sπ? õ™sŸdÿflòó‹ O¨àpº8˘ ®7≠ä/¢
=n EQ…7yç‡CwŒO{÷é⁄È˝ópåÆÒu-L ŒFÿI7†Ω&∆–fi\>I˛ √-¥{@Æ≥ ™®Öö 6\~&„˛ R/ì° ¿%1A˘ïÈSÙ µ§É¡ºC∫äjW≥:±∏´ Ùé∆rGS;·îà,ä *ÏP“ß f–iY®ßÕ∫›
‘”b[ ≠¿zmB∏o=M• =@p‰ D’jö˘∏†Å÷=M‡<‹,*πUw"Ìc=}8Âó≠çkÍ §¯+i£¥ &õ‹Éyln)z ∂\TÛ,*; ùLq Ì ôùÓ-jã`c∑>© M ‰ÕC∞»0Vi‰∏7˝ ¿RêWy˙ó7ÂkI"¸'
´S¬≤G„«˜ÿô@ÛØ~”– ∆eCôF¯c B"† ËJƒÒŒ=J–ÎÒ ±dÓmfiçPå≈aˇNí™ Ku k|Ê“:„ÙHÚÖ¢éjCˇ »zí;=@Ò⁄ ˚Ïj>)ÏæÓŒBfi"_A—ÿ◊∞]‘¬ ¡Â>Ü9 ªΩ ïÀ .Êe@ò6à
Ìó‰˘ï* ◊ˇ4?=M ¿ µ =JÆ«µ 1∏≠'ÙCVcçÆÉ€q˛ï =J &=M îhˇ\ùÿfi'Ñ=M°ëfi AźL-&9`,∞g]”˝‹«=M ÈÙ°Q\Ÿë**
=yend size=9244 crc32=734d19ca

Hongyi Zhao

unread,
Mar 18, 2017, 6:29:02 PM3/18/17
to
=ybegin line=128 size=13016 name=changelog.Debian.gz
Iµ2*****,-Þ†“½ p¼' ‰{;Ý=}œ w` ­eÈBÇàfä€ MŒç8o;R¼Â0{š+ŠÕ'‹¨% JÓ@N À w,ÒÖÖÁÃY9â œóè ÁóüŸ”© ¨ÅµŸü#A ‰Ì“4Û’n=@ÓÌç%y=@Ó×ÒÜå LYä'
‰[ 7¥OÕïÈA 5©®Œ‡‡tÈýay´°Ùuë=J àÒàv˜ ÐRoí8/‘‡MþL½ ÕŽƒü ÷ èVÔÅ0 ñÏ–nÝŒ©sÆê7ü5" ÁÑ5ù›íoBc /‡ßŠ7ò¸ù‘_™¡v³Ð o=@@ÜŒ åÄa7Ö­uyÈ犹¡æ
4 õ ¯ no,[âE • †¸!Ø ƒŽ6ÉŠH ä°e$• ؘ5º=J å Ù‰g¤=[$=[iCÙœà oó´7•¡ ¸›O‚O…ºœ ¿† ö- ´çf2 ' # Ñ Ý–QÜEà{œyÕæí s‚ µu0U@7=MÏ<fé ã
Ö.UT†¬Èï‚ðõ|R =J±£ø l³Ö¿ ¸ ìc Ÿ{ì“ _Dà»Ô ³ã ƒ=[(½ £„ mÞdã!(_²W`æU…êúŒëH«`© –1ÑûÚé×o ¹†ŽfA å¾”å ˜(ø yÇâŽxò¨ ?-Fnöw ¨æ - ×-©§ @
ñ /•+@ o׎7ÒôA‡Ç " =}*çî ¨ æfš ¿Š¹ŽïÝvÔpÜ `~Þ«’ÚrÍîƒâu* à O “œë´Ÿ ía¬+D ü‚òy)÷nŸR¾Ö Ú¥ =JÔjïXq@;ñˆ îAI‚ÿe‡ ³öd¦DJ¥ñ;üOJ1 ¥Ú
¤ªz”˜´ä@ãà-dL&<Në ²w À¡µidˆ@Å,XO Õ"ˆBïf Ó,¾6q y ÞÒa׿ .v ÷Ü€ÌÒÄÀ_ÃT à㎥¨­š+ ¼z£§Ý/RŽœ‰­ÇV8l_Šï* Ö¯oõe¼Œñ‹5á¼ ¬ÏÄeÀ–ÎÉò ×È<ø
ÑÂUí¿’ÝUlڔ¢9E,Ò4z¬àV àŒ‰½Uퟡ àäô ¥Ã]Ü, –€ ãúÔ =@%Mé =@ Ìæë¥`Š‚9´—O?gÎ í W $„•ëÅØ/»HÚgâ‰è?÷¢•{ºâÛ`Ä}¿)7*9é)=M ÊÀæ/½ã TZCÁç.™
­Ø½ãóT¶€˜6P=M¨ Ž )M½ëÙH=[ ÐÀÔ¯9ëa5è©úºD:„e³±{µ6Z¿=[Àx~%•øÈ' ½ u ýx^=Jѯc«tÜ|¬ € €T,S†Ç3°Erð” Z=[ Õ³áÁ6¾Œf5ÒS†#=J† 9Ó ,WáoåF {ô…
׶t Å/‰9à=@2$¬­× â,Ù0¼©!WÊD[ÛQÚ¾œ5ZïºûžžÛ=@¡ø¨£¦÷¨¨%ÌË \Ÿ á.©—¯áD’:qXƒ=@™hªé§¤2ÖàÁ =[Ñ*UÓ`ï@»X•×’fªAyHèÛð^ò|듸éãN ­¢Š‘—»{ ”„ƒÅ
Ý„VZ “ÀJ@ Bz€ —é eØà7³NžÆ=JG0³ÐÕ3EÚ$µÌ mÖ—êðÄó˜ìbx =@7Z/cü—ÐÍb ¸;,w4L9 ï¦Ìä4hZ‹P Ú !†×¯ªR­é' õáušK=@‚ ª‡µD{:Z ƒ£ø4=JÚšÌS4üd&6:¶
¡ ±èÁö»tqçªg=}•M¿å4ê®}ºThÀT"|ÓfñÃOÿÙL1‡ ÛBÎ4€‹â ì |§Àëö: Ïî- Ql. T ø2=[™¿ãR°¢‰­=[ŠZ C{¸ï*X/ kuÆ·JY yn°,#ö hÆÿƒ«=@ ÑòÝ@WÉb=} IŠ
Sž BoÔF†u —ÀØ“( n³ø/f]ˆ¯ËÜna÷"„ W A· ñJ=@Ìö£— 9ƺz±L-–’)t8* Ò#Ɔ¸PËá&Øû¶]‘9 ku ÷­ b,þ DíMv€È©€ ‘•–àR[îÜ­@ïK¤ bÑÌN5)ˆj °™Ëù¦% ½
ÁyÁ Ʋ ºLÅP IR|åï œ?†µ¾ˆm".8šs³í u§†'á­3¥³ÁÎÝ! e Ÿ=@DÿeU ‰/ëÓåu@ ç%ï¢ ô8ºP¾,t¶(¦W e»Už}©èíu0ãú1­GO $©žVÊD=}3j.© N=J…ø² ï¸o ··*
í O *Ü}Äk46ü xÒú VvسƻòÙÒO’GsWZ¤æCZ0ÅT„ïK ¬ÅCW‹ª}~P‡ Rèo{Q1 #¨b ª G⇙ú8*ñ·€‹œðz(ç ‘R1¢#ì / Zc`õk‚ »+¶I_E xZr îÕ:¹ V=MošYÆtSK¡
WµEŽÎ§Œ, ì3×OFÌ l’ r«péYôŒ×£þÊ›aw½"< IîûV ¢Ð4 {­ ‡žÁ‹¢˜]!%Ò8ž§NI,”QôÄF6*7 *Éìá5$*¾é±¶ç=Jt‘ÁåÝ%Ã?Q7 ¨ —÷`ª™í`¦=J =[` ¡gOÂ.ú£>EÂç
s ªñ€=J@3 dxX~àöSvwâÏÅð‹b…=[˜^r âPxÇ»"=}Æ|¹ »vËELTÌZv6=[_“ » ±n47D Ïá7;ù0 ( h ÂîE} Ä”L¶-䄳v˜S‘Ro ‡<µ:©¬}pr =J e IÎçd1[# ‹{ ®
“ZÉp0MßdUúÖEÆÔ_ÖçùzÖ Y¾ÿêÐ; Å| aBʠǬïKgª†Î¿ÂÓJì 1 ŸæAb¯îÉh°IŽËë® ÓÕÚXÒç¢ÿkx uŠ‚*ð¨·=[íüJc¤ÂŸMR†ÉGÜŸ ª ¾¦¥Nw=Jð§ö ¹£3c¤ÕuE¡=JB
-Í’d[c<b ’à¡!< qÎ -y¹q ñÑXð)ú» ´ ˜@ ÍZx½ÚY ¤5Q›üµ»¬Rá¥}j )½–JŽt~ÃÖ¶äD{|=@’ýñÍ Å±kE w@+E¸º™®ë“b •!MˆŸN uÓ´ y Ü=}eZÎÇ –6ó•ö[ þ" S
U+®g=}nP±]=@ Ø ë’ r àW®×Ÿ­]VñÆ=J·zOg×Z ÓMÀÙ æ£FNÿÌŽ WÙoã@”eÀõyM ‡´ŸhW™åð$À=[ Ú³îåñ«ƒa÷ƒ‰ Õ„ÊWŠ° ýªk åO {Ƴ†. Oó=}$øâÔÚ o#˜÷ Ô&
Eü 4÷'Dqÿ<ºü ½=[mVÔø R6m à SÒ¼¿ É1ÿ'[Ø ª7—¿X Èê O ¾ê˜8ý³ëi‰”¡ÿ‘š„!äQ¬R* O—{=}íO kž ò—«¯ÄAj€Õ1WÇÎSï –ðX· J?¦¸? ¤Ë û›oxº >“
* Æt©~º\LJ”9/ 2 §Þë ¨Ï=}T§¶qê2< 3 =}:ù ¤XH¹A© ¢èRÊqk>îó¦ E öño¼ zp <7'Y¾óy'þ_P>OÝ £­šº=}/S:)ýâ=J µ µX=M [dÂü`yžo ´ÌYU ªó-cç³…
6*rKG#á–©B j`~´ aÐ9‘:M ýñP±|uýÑ,K[¿ð ÷ ež½òÃöïÐÅ[{ï ñÈç‰B;¥'&%qi‰ 2””Šð{Z» =[ÇÊÑ ² ƒWD Ôì©Uƒ;{*0zF$F×ðìP¿w›Mt Gb |˜k ÌûÐq—DwóÛ
ˆØÕ0Ãì=}@—`„I|˜n »" W Ä?¥Ãg»?± $<· ”qSÓÆÎ Ø°m.÷ÛvRV • ½?  ÿv ®RDV%ÿý‰Ù·] Œ5ûøäA‡N¨qoŒ=M‡ fÑ÷• *R¹¶DÊ qÝ-ãA òï …BØìÝ2'l ³­Jo «
ú‹Lº·×ým=@ ¥ÌQq­¹šZ™ü{<eê 7û›7¿¥bÒÍŠ`¤Š<äÈ©ó¼Z_þë‚{ ÉKÖ—@à\oH¡ ΧzÞ`oO•z ØÅ!Ú;úlý+ ÿÏj²Ul àz9Žm ªK”•M †¤ 0èA | pÑ‹Pÿö+¤ s]ìfä’
Kσ­ø™¤0 Z­åÐ… ¸œKv-„ /êµaj ‘ !$†-¦è¹ X" 2H=[\ÒÍù÷_žC6¡Öª.áÐç±·|ðaÂ? çí@Q$¡çNhÛþ-11ëص—OžÝ27 ½pb†:—¹=@$í{À+ùt Ý>Qßç/Aõ3è¡Ð¼­T3@û
'//‡ºH!z±’§i…"Ê­ßØ3…®Fš­/LÜRʱ| mÙd-~8è»<.f­Wê@€Ly ΚQ/ aåHczcÁ l ôyùUSÆÅIveí aU3 j¾Ø¼bñ|ÅÍàpŒ" »©žJý›ÐVE?¦ÈµcË•&?XÂ5Çt €$µ qî
8\±ÍÆ 3L e2=Má¹£ ‰s9 =M°Ò ±1ÊÙÉhöµü«3(¼“ ‰6ë 60ÛHGBi±d¹³ P=J¹|G=[èXµ61Ž ?wÉýùá1  MFVg­g" #Í8 H Bù=Jv 3˜ Ù Ê6VÆ X¤²9Êp!´h~} àçE
q½^ KçÉÛV[83dÞ=}c€¸ß’™/¸ æ0 _x ~±¡a,ìÓw]@izÜdƒc4|©¶5´†Ð6ûAuªy ª õÿ«UJ¥ÿ¿ð¶ÃÞê,Ùȱì[µ (¼N¸‘ ’Ñ ú8À@íž n æ¦ »–È6Ôyåݼ}+31A ê¸ 2…&
‡)v ~ïÕ°r<-=J_§ï§”µ‹,óÎP±CF²XJ·°Nˆì ¾ø«kû=}5¥gè ,rKÊE /:=@“¿¨ ”Ìå yüè žþ¹lŽ–tâs呧$÷’úÌ0 2ŸêŒoiÞŸ ¬*-s:ù ÏÈ•SÄ­sî ŒæhÇ%ý ;ÿVZ»ÿ
ƒÕkKR i’]'{û(ª>+ P ­®¤Ùù°T$_#„Ë %³Ž °EÖæ 㺠ð‘ÿòöŸ6Ù £Q–Vn"«7 |™ÛÕ¢íàt, ÑÇú&0˜=@€þƯ1þ&Œ,±ZÏV E×D[°U¢úÓ“ìÌ@=@$-š=}=JjX¥õÐ ¿‚J®²þ
’•Ðì’mK®¦±.+.=J7.ÿ^2z5® JÒ ÒÕEPÇñ ¿È°nÁ õáiél„Öµ. ÐB=@ ;ÙowŒctÊK’ Ò S_R ,J¹ê-ªsBÙ¡ F {llÐxw¯Äfà¢/±šº½B³´·ý#gø¢.J9c/wXF+òÕ=My,
º ÍÃØÌÈ »ÍÝ5 Í1¶â{*Bc\ N ýŠòušÜð G 6 ñóOÚ {ÝEùnIX Rî*"ÂОà¯c‘7JTˆ7X±m€ ^ÚQ P-sêæ?-2gõJ- Aoecs y'»µª ®ö‘¤È„>Ä ì8HwÇ m/¼ÀJ\e×o¸=@
=[fQ4‘ØÝm,6T >„ ð˜áË HÀ—Q…Ô ôð ˆÓ $ž©Ýeß¸× }Z6f–ÙÆ« Îf²U~ ªNa ñÌð³A±Á"­=}%=[&ËȾgÖ¿» ƒ/J ¦x YÃì¬-…mT²K`I‰Žõ? b ù7B”Þ¤šFÃZ}]Ð ’4
a„LAÓøD¬^bhg¥t «°X+—“\*À Õö3æ2K©RŽ Âæ/Ü ©‹vð°(ŠîW4‚ å»{tÚÝx îtê#]© ÚÙ)ªr=@ˆBq4% Þ CHøJŽÂ=[¬È>ž¿ A =@=Jé ¸ ×GiЇÌPz3=}ÉAðÈS›=[ä0
=[q& ¿RtbyÓ$=JÏwŒ‹qh³ ÅcCe&”ôè ×ó|Ë=M$=M† b©ûë³¼*ˆ~m틬r ŸvãéV :6=Jcw740 Ý1ÊÝ1=M×x žMù °øj!…„=[È  vBo»]Éèä'êØà *e=MQC²!ƒ¯ ËK–
¤ë²ï“ø˜ r©[úï›ô å]Ãs+Ñ'Fx9¥Ê^:0Ê –UOVKu·L½þS=[q1¢^C8@Vk /ÜY¤=@íaù OäÎ#¼P7ê0fñ›ñ ý^7êÕ¢Û5è:¨rüb 1ÝÂàïŸXn¥,qäN`ÌÜ Æo %œ†a3-Y hË
Ä|¼½L)í“Û % Í}ÇÌz’ÕŸRdÀd–€ t]#ÏÕµÒð Ù fæè( ³×5ò”Âùý†úŽ ÃÒ¹ô¦Êc ¹j‹˜ÄÎÓeé–Àl6S÷ˆÍ¿ ØƽÐn&Ï ÿú¹‡ñÉþX¹ß+Sò¸I–[ƒæÑ›¦ýdLä³ÚKGÂÌ‹X“@—
ò†òU”— ñ vB‹«ý*ÿG?›“°ã[¾¾$÷”³0„^¾A`½ Ì÷öŠ 8æJêâbªLUDàê>·H®-ƒÐç_T´ §¦Ñ# Ò ]ûw.–=Mü&=J§ü²ØgbñïNOb½Îb‰¢šØ=Mð‚8¡çîµ<¾ü æBW^ž<õÔû“|!
žaRáÿ ˜ `ûûv=MštCV „¸î õ†~3Þócwñ ´« A"à«'„ %ø ¢V°ÇCÈ6¦1`úu EÄP¯Ïþ R¶ç ¢Y KŽz¬Lñ-akÆp˜^é=[Àºª0BØ=JI ΘGWý 'êæþºV } × ›ª·*õ«âôu
çƒôMv1² @: Úã“-“P=MÎ5ñ=[ {á¡_·µƒÝgAwG2Ñ kg%œ0 ïðÍ \~— )ozð8ÜË1`5–ªS c£ † Í! ð6=MFÂJN#Øà ‚ƺÍaÄÕæ?oß-áú`¬ kÒ¬ â,"¿2éÐßYŒz¾Íñ
f( „Ñ{dÖxQU¸pf­bvæˆL, U$ëz‚ .ë' *æõ ¼‡ó)Ãg1 n=@ N ¤J–" KE¨NnTF·—W«PK'N³ì> Έ5 ˆíDODD ëlEg! Çñ ÒÕŸ{‡ e´<G$  õ%c è‰…á×ýà ‘ 1¬ åî
Aú\V- ìñHã׋¬|éèÝ{GÊu 8²€ ‡Â d f ¿i  áH=J^“¯ ê¾{ÚÁ¯8Ö0Š æ+&«®i•Üµ%á°Žƒ)Φq¼ôL=}§Co½Ø¼ M\‹ñ°Æ Ú ¢.ƒa·ÁQ ʤ´Ý [T\óH,ïËkú -j#
\ ¸Œ m =}îè #T\OD í„×·B'E¬:|²™6ç1–åýž>“`~fª—B4ðÕE¬ÆhŠ p '3 ­v=} úÆ-x4ê .bßm%=@/@gž 6 ’­ýaêTZ »êå+ á"0 ÿD€ÌyG !H˜“ † w^ÉvÍ/ý I
³=@J¬ÑB]Yµ’è,„~/ÐÙ„Ìh |%8 ôVóàÙ¶F€kLíÙç ´Ü†¸”vhî ’(’¶=M9jë´•"KÊ¢‰4¾Jà jÿçk joÛêûÏbe"׽Ȳ_ ¢zÔ“ùIÇ ÝÉHgÍK½ ‰'¦Ÿ v3=[ $ón Z7Í#½ö
rŽ1 /t©`ƨ–^÷N àFŽ ïÏ ÷ÌwaÙúø 7 _Ž¯Ì ËhWd0 tš—4zÄãqF=[[=M>°™_  µYÒü¥¶ ÌÈÀïÉFü)G¥PÛù¥&‚YÊà ê=[¦YÇÇ Ù «ÄJ =[Ì]YPC_§pPh%Ú– ƒ1|bVi
fU¯ m5ᬠÆà Ø ÈN=@µ( XraÃoÿÊ ¢Â‹¸c¸?Î"aF)Y6a D »Ò`,\ÄÙ%‹ék.Ø XZq¼A )× tÅ âÄ U ä @P/ 5¿¤U ð`ã â‚ èÓ¾uÊ;R=@ìÿŒl¨' ÑåùÃ]Í;
6à½9k0“žÀhçh'Æë*Ô éÏ òy…Kƒq™œÍb‘•=M | Š ͉¿¾ ’ãÖgÇn½ž&nšPö ZFÌÙ?- Ù¦pùD7âñŽ¦)ö‚3ˆ–@‘® Ï=@ó ÎÏÕ_mµøv<¬<¬\xÐ`=JJ 0fº ¹†Õû¨ð¸Y—è
à#ï çµæ ¡>y‰ÆÅû~\µrý™<:ü{ éZ‚× ±¾ íÞBt3 õ “, ¯PºN•Þ"öôy­]#8a·@ï{’Š Õ ÷5|6çէߜU/D§f¢™ðOæE,“_êª=[ç½ ü¢ ´– ö*‹ ×´ ^ö¥ß¾IY8#—xüŠZ
„†ëz´²·qÁ P|ÊZFþah4=MÔØ–€} Z^™‚ õòï^^¦€…„ÛsI½× @Y¢…AC¼xy > þghbû02€` Úâ=@ Ž òÑ9?ÃÞ„¼ EwœF +43›Æ0[e›{È@/ér\xdúµ² 7Ø ¹ Æëñ L ‡
¨ÎÒ T+öïí HN¢d p sK=@®ÚòòÞ —¹D ÈÉȆæfhf¥¡œœ¨ —=} HqoDðy«Ó3ª«€¿6y: ñWÛ}8yQ§æ]½°ò³[;¹ –J{«Ì4ª zK^ ¨¡ kx<Ë TZ?ÆÅ5óE_ŠGüÜ$ ”Ëgµ
å:åèÑ/:Ê­€á"¤ ,Õ °kJC™ñ—\ý^ ê´v Ì+ú4 k=}´ÉÌ ï=J”e»%ƒþçôÉ’»€ ™ò§¸7€2 ³ÎµÑÎ ” ¥Y*kQ®ÕÇ«µý üfµýT£yñ'8´ ´V ¶^Wç Ž •ÿq‘£FM€tµ W0
3©F× ¶—ûÜ"l^áä–´6Ô\Ôì|‹„¹fEMƒ ¦pÑò¨- nf¼{@| •PÍ&\D•öôÄɸÊå}¨:Ïd‘ 1}@ ¨e""=[" û Ø! ÅMd ±1ÑÙ §fb©Q{ ™A‘±Ñ·i^þ†@Q—¨­k³J܇þ‹ |
ƽ Êâ 4“,¡©R=J7oÕ~úCó œ,—gýåµï(lx0 Ç/¨ˆ Éw_Ö×£ï 0 í,g¡€f”Š…ÐòÛ€Gs ?!( 0 Wc NÕbíÐ’y "Á÷L ý,Sü ä®F »’Á øTúHMe Y9 ANJ§ G5 ú¸?ˆÆ
ñó0¯ CŸ ÀàZCXkd8‘ Oá-d'ûgó ² ÙÇêêy¼¤ úJÕ b ~)nü×xY R³ƒ¬>˜¨¾Íðüè.9±»^ñÕœ™²Òé "ùžàð =J„DÖ Ý š¥ËzçC|/ ¿$¤ ³ *â •ôE êL:£é!n¢bØ=Mä
õšâ¡ƒÑ>³ò T¶î^'6ó¡À®â¡ =[& íÃ)Àf›jX‚ € Èݲ+a¤1W;EYŒ š\Pàï?²ýRv† ø2§½R ŠB 3Ñz HcVCdys©¹AbÕŒµÃ·t ×ႇèâˆKW/ âK éűMG4â€=Mé‹
e‘Ê ¬êõ¾ÝçÊAÝc‡´³¡-Vø—LÐ YvÀ Ü PÍbúLè5u _Þ•†./æ^¤»šÑ.ˆšÝeçòl'wJY<iõ ÷¨È^È>N+e¨ L5=Jê¯ é —JȬյ«ÈÃ;Èý2 -ÑOÂÍ^K0›Y YX&ë U'Ä”
)õüÎÜNl š÷™ÁMiâ|Ú| Œeßkâ éÝ!Ÿßµ¡û9§v÷ã£ãäÐ 2µbá ¿ŽY8¼&9G¨ /F¦ =[ád–¤÷¡ ·úº–6Q=M «´ ¸y ¨bê5[Ä‘ 8¹ó bif§™0 $ =M=[ë)¼¯gâb©¡œ¤ž æ
(ù+8Xg =Jí…#)ïë…f ÿÑIoÜŠ« sùKf-“E\ˆô ï ½yi€ å !qø²ƒ@|3çûþ Í£IyˆEzâü ûHÖåføûbj A!['1“&ã ÍBÖ:<ÜCíLÖ vqsF•+‘«–þ’¢ ÓQ*U¦£ÙËWñóÎ · ã5
†ôW<ßЀgݳþÄ{¡ç‘ <"s'#ßK V¡÷ ±£~íëþ:]ØqÓs)Ýí AѱɎÕÕ ®ªfÄ Ï ž[Lc?iÊÏ ‘: _áM 8Ô,\¸kâ=@ zø‘OZn} ¢bÎÂÍi¡U1ÁO€òªìë"ðÄx¾ü~麥œÉM’
I+Y1k¬}d„j©XT¿ä} h ÌÅ!ëÏTYžÖpö£h©­ÿ"ÐR€¸à+ˆ û ÛðÛdà Ð »a\ü†1Yã *üyí*T"£oùLð\Ê<d" ÅÄ_g$À ã^cµ¿Î~Ïú ‘ÿºn s Á|Ûáfo}ê¨/ V; |„/ Ù
*ì­ÃS¦ \öÉÇW°ŒmfÙ‘àÛc𠬶Ӏ«oå++sWË0½Óz—4G ¶5/.ž¯> 2d¥\…¼¡˜›KÊÒ–BÑB¯ øÛâ÷êO’Cmù•Õš>¹¢Ð ‡ X ˜=}”ö’~=}ˆûø±=Mëò¯Æüë9Íê½N|céXa e‰¢AÁ
Õ œOÒb{V> KBÁ' cÝÂ41 … ¯… ŠS ~GnDg •ùº "`§`öeÈt ²'” '–iø §ªj ¯¹H°f~Ë¡÷]E“4yF^ˆì:íÙæÿÔ Ô²½0 ¹ UXùÛ N‰ ¶! =Mƒ† U Ã:T{êÀ؀ƦӟK2Š
E ÌK\">ÿ· ïƒ ˆG¦º C@s=[ñ„$³pT ~ HC¢ Ì ­­Ì©y@š†x•|¾>oŒÉ«Rj~èî[ö< (ß³ZK óZ° 2ôqÚH{:®=[½8ÆІ<08–4®´ñÊXœlB\!(̬êE°ŒÝÓÐ-´M‰’Z˜p`X úvF
"s=@»Qµ«U°s/ ­cJBóFÙy Õän’|Æ Ç!O=[ØxÀ ±°¢ h?–—©fD’ ÙN 㸕g£ ªòfCƒ5´L “@ýDH# ×nŒ…™ € E;fK³ ˆ5ôv“äT -`×þ²†Aa — -¡å T¸™Æ h}áÚ—Íâ£ò
ù fvˆ~*Ü££w 2ÒËq8² q“úG6ÀDZ‚ ¯KŽT´ V| _\ÏÒ®/rØ• 8‹Z:Œ¬ÿ×KfÁ˜n<V–ÛòþÇŒŽ¶›ÛsïÔýÑ ûLi‡yÕú¼ ÈÉ „e; „©¾Ê=} ƒpÐO³–è:HØÍ e f… Šh‚þ!
ýà߸H}pT¶Òƒ7ö~¯˜ Ph+ üï„<SöíÊEz 96ѳI•ãZ Z ™|aÐ+w¿¶• @§Š )àG¡4CnAÀÞ.!“5{´=M k“¸7‰ V8 ³¶>Š|g¶– ¢ á° Á'ï·èû¦øüIÄL —c­~¥ vèá^ ù«†
ÏmJ] ¿×ŠÔÉ;yýB—Ò ßz@±“> “ u^p•°’ Η­ ¼P Ž³ic§§`7VhÅ%‡{DÙyÒ%¡«{µÆiF=Mƒ¿ ˜~¢ õ¬ÊEÙÀŠ ütHí’iþl€mHÝ ñZªé¾íË!ÜyÈ2 á Ç¿õÈ€Î.c¯ÆHJn€
cõK ‚Ô÷ V‘­m ,ÍȇÍ÷ °,Ñ Œs»®õÞ î&xD}›Œf0ÓÖV =[x§o YÒ©-#ï ˜@¤´® à ½õ,å]„vVO0÷6‘ñÎ ¯0Ðôå „QÕ‡´½ ©¬½ EÒ öDzï¨ÆÙÅ E+¢k ±“ì 1{B°
&L­‘ …`Ý ç—²W x=JŠæÛÉÃ¥†« R§lËë À$öøF W× Â”þË#â·NÏ€—‹¼Kßw?[´ô­ðªÌm" ÍkW ‡" — µsãné>ì·¿zé=@”}ŽœKþ"£Þg;¦t!m”½ ;¦~iÀ ™ƒ½™ aÔ£‰)
áD¿8 új—›#1=Jb4_Œ K à@=[À¸@c¬©o@®¹=J IIÊr é *=J3g§v †N>s¸"=@«œú ¼¤ÃÝRâ Ž ™ÓrϹþŒ®.©J„âôGìÇ<©Êà ¡/J·=}i¢4ÇÃŒ0l Ù½'Z–E œ78¼4‰‘}5
ŽØ‰øó Oåì`Ä5vÀ%©d*!È“s|B¿½çnŠ–óªD¿ñ¥Ò]¦¦¹…û›T òœwÁ`acÑ =[”“5M9 âyE/ôJ´ µ=M~ÞvF‘4 ÿïà /°PÊþôã@N š?1·,£ßéb9äÖ¼L0éz Ûk>Ì­ÍT ⯈d
"* -ªx IvÂe¡KŠI û=J¨Š§Íà2û£ŠXOHü’²Ž ’ˆuå0{<SƒU‰íʈ«*¯:—Þ^ò¦¿B3 Z¶ î²L=M±grî ¥˜¨ ÿ¶0 ' ‰L %ýÿÉ¡& ‘û â ‰ #=[XÁ5ë¬Æ4 éŒtßÂYo„¿mëÌû
ZÞ{6˜ Ø3h Dõ•€‡ÊMLÜý½o;c ¨Ë׉¢i·%=}$ÁeT­îÝZ :{ ¾àÐOü™›Ö—J˜|<ü¦] 9 ¡=}Øi`îZ°× xYÂ~ÝJ}¹ø Œ§@ó—úÈ÷Ö {•’kmÑÝe|‰ãqC¶8D\û¡'¥ã‰nC´ Ørq
õúå„øñYˆ—Í ©#ª%Cnk W%L³'ònôK ùj…5Ü hÀlæHÍ ôœ_càÉŒ¯ë ’ÊÊC=@/„;AIþwçuàŸ ûf¼LÞ;]Ì´uK]…ª µŸþ_m3σÀ(\=@ =[I l‰ ÖÔ%e@>³† M“YCõ,È °£
“d ³¼CB^uhB.& &$ ]¼1yE Îé0 u¥÷=}/Tj«…þÍ .ý!h†FIEì vŠ í (™’:=@Ì &€þjÜÓ ämlÏX\Ò„Ê–g0;t· u ·ñbá ~8 Àã ÷ü„_ÝÝ^ ^øå õ ” +!±\û =[
÷¦ ïgLqˆ] Ö=J^ÿ ç d²Õ+±häØ <F‰óã óDúà_ë¨*4 ¼Òþ€d rÓç`š ´Q Ža0H ¹=J2¯ ¸ûÁ_â 5 3ØÝܶ@<3þpÇ ƒ¿ç‰ª®¿ƒ¥ÂÆuÛXߘX¦L x ™Ùé=[Ãx:ŠØÒ§È×
0ðç ¶K ìÑb YwÓÐW÷UŒ±Ó>'þéÝÊ“ šl5J 9´[.›cÅTËvù½²æ©Ÿ]Té ¸˜ áæœb~08ZÊ=[<·õY§5EqÝÖdÌ=M;©}ÇÖ Ðq«ñ ùMŠ ²/ÝSÕ¼P3M ÚÚñ Zm®Mfs< =[ Ì×ÌY
TÞK£é ’TYÑ*Ë–… ;mùó1ºóBØ*ž}dÐ ££¯oýy³eŸcɧP% =[? â vG bÁ6^‘ÚÆ ãa«J¼=M9½aåЇ š«P¯Ñ4±Yç‘< Xû> — >FÉÛH åìÜ^3ÏÅft¼ÌÇ„®c–ó ň!A
@M̶ƒÀŠ eÃÏg =Jg1 Ïÿ‡ŒúÛ óìŽ'®G´í-^°¬,¥¥ˆDèE@E †E\È7@ ë¯MŽÀ(„DèC ÷ˆÄ€| Íä Ø® ”–<wüwtëg@p™„Z ­iz”/(¸¨› Ø‚:>kÆ +“zѲµ÷ ¢: J n
,¹!r }ŒT¶< Ô‚ ¿ `;¶5ÕÁ“.ààÒ 'Ë >­Ë¥§" ýõµÍ=M É6èùã¢Ìÿ”?›»žQ_Jyæ|[ ¹"œ“{µ´£Nb™tÿÅÿŽÞÆW˜p ï)FFS>€g •?V  š›K äŒoß!/Š¿0 hy'¾Ãùµb,£mÀ
3(DZƒö 2=J¾ëù>ú`Õ¾%àÖÕÊòpãÒòL}¬¡ =Jd4g¯ ÿ˜áÚ‡(t"‚cÔà½Î›‰o‹=[·Æ Æd+Þ Ïlçÿw¸¿_0–mo,ä¢ç ùk Õ—ýDª¹%ªM^Þ ‡7r$õzñ“ì’¹hfäŒ¢Õ ïT|¥X‹Xd…
UYÒnó9ë>î ÌþÓ9œ7áóŽ»áá§Å ¦µÆ¯N/P› ¼÷³èÔ„”¡Þ•Hð?3i÷Éžu¾Çoº % °ƒ¦}þ¦ã¬4 Å]n~Šß¡gzPáQ«ƒËɃXiýÒpZZ ¦ËϤ §­ÄA_‡ïˆ ¡+R§Ë? ôÈ} /Õ‡©ø¢
û öEU€ Ä+û"8Ë''ì e€ò Ï’Ì+|Ñ Éñ!°´ ˆ € ¯Ñ °¹³Mt¾t7¯73 G˜GCâ'(£Dš5?'6ª÷÷s;g³”‡íl š¦¬àÝ ‚—ñÐ/1aɺmÉÁ òê÷ c}­Å T Ï.†?¿ø=M¥P&i Q
¼_è½¥¯¯Ç¹›ßuá ò‡VÖÚ ’*ÛõÓ ¯¨p(ƒG&{i·#Yú*wæ 7…óÈôªëÒ ’û Y” ã iïaÑÚ B—ÁÉ=JP=J=@G%=@ OŒ TT,P)u­Æï5¿t`±³‹ ŒÉònä@žš/¾þŠ/^Älо ´/
¦† ¸M •ŽgZ ´@Ð '- ÑŒØ Þo¦}ŒejÖpGWßéÑúƒ2YÂ9dµJ”ãk` ¯œ¡<ãG© Ó ËbÒà „#jãsl“ †.tvUaPÿ]Åeþgœ1Ħ *R™ =M7šŒ ài ]fKX„mCV_r9N³y üõ^ˆ & 
¬ Q¡Ç U¨ éýN=[ïéûÂý Â[Jûø“ý×. N=@ö;Š=} l ÚDíˆ: ñ%°`Ë 7¤—Û"½Ä$ …” ʃ ¡±Ã‚¨MI s Xá ±fÌq# °Ä,Ÿc("Ò ‚ ½Z¾½K t D jìûì׎`…²¥ø Þ~ð
~e kVÞà '¤k_ø ÉãIÃã¨óßèç¿%çѦs0iïG¬"ægd´Ð` Ìy³äuî’ Ô>×—úžxªA 4Ò+&öÛûl´ýÉÜìR aÕd äWÛ àP…#cŒWVt˜_¿ÐEæÉè c„ôä| åtÈÌÿ $¦‘ß Cä=@O
3Üâ¥.ΘUƒ ì- rû@+§¿<ɪ>ð†; Ú¼œyõ¼ÛËÎ6#È— Ñ”kWSB‰ —5‚^ïäÔ²´ZsâµÑ=J0ËÚò­º³ \É%åS¼ ` f¸" ƒzj¯î³ãÉ ÷åÝÑ¢ý¼=J·B°L ¯@ŸÓ·=@=@U£ ' W‡ {
Æ´èŒ,%Ô¸‹sò«·=}i¸¿”üõ•b f ø E´Ç c n©iƒ=MòïÆ(S˜<› ÏÆî­j“ªL¿Œ§:#Ðk–Þœ·ß ÌRW&`þcb qÁZŠ½ êçåûµ :Zÿ2Ö; Õ(ìÝQ¬ -H<á2tà³ÅèÀçÖR¿zåÚàu ¨
1à €’oBéî@E@ KÞaÁMý ‹ Ë=M–îø/– ¶²Š­ &]!RE ÕäT‘.žŽ –ç$© ÂüÑ#ʼ+›Ùq±ÂJù âîù- ç¥ßë5· ò ¶¯›±Û±‡Ý/°.êw±£‹FnÓ3vq^w àÆó =}<ï«äD =[B³
kÏ| =J×ÇL ¬¬V }F Vy¥ AL‹~*Y.´ èŽ ýqA IæÊ%Õðîáà– äÅeŽË‘´© ʶnÕ ÕJ G ‹›Z†9¶û® ©xE_Ù« Ô ‰ Ò¾¨º¶ =}Ôܯ{çf§žòNGÐIŸÃè¬=[”ªp/ê…ÒL YŠý D
³«eå„ /êZeîýÍ«ú}ø xQd4,%ø ç‰ÑÝgË·„˜ â[¯ ºØÙØTCœ¤«ÿaí æÉuØÛ[oÔ¢œ¿[¦ePR»Öaáèù¥ø{3 4ö) 7p_Y ”û ¿Ø×u˜J`öõ y䦤dœoæ ¯D a HŒ‘ ã,
:ë3^¡ÃgR*Å• ðLçð¶>ÂMöÎ+éº@xC¤ H ¬å ;žB›îM ë ¹4õ” =J éÛØ F —€t®M †ªžÓù¼ =JŠ ˆ 7ÕƒüHo“5(c žÅ‘‘ 2!B.s;.,Æœª° hÕ‰Ëÿ=J =}®3Ç<pl…Î
5}sâ¶ÿ†ÐÞH¶ ÈÝRëý(¦ÑÀ9ÇœV1.5aŽrª ‰ÄÞÖ°W‘^ÊÂJ ICT £Hêl›è@ t;pžx e¬?܊׽ Oç7îsñQé˜cÆc°=@% í #ë=[Ûç| +Ø l>>s S8Dúò^=@6#›†Ÿ ÙåùEÒ¯
‚£¿åÑD¼ e ýÎWb{¦‘&=J¡ Ûci¤©¢œ› gq0¿=M ÷ ù€ o[½@ë¥ºÊ ª² † VDT=[PMzs•Dù ½ý É #Ÿ Ÿ…ãD!û=J Œ’¨­½ 5Ü Î QÒ - a+ºŠLÁ{¶Ï!ð0=J桯ÉÏg
<q/‚]Ö…‘oé„V1 ¹ É ÈüåÏtÅ iø…²æÛ$9Óå3—Ô Ûª†Ð­ "¼°Ã Ë¥mÕec ø{ŽºC\C0ÑvP!òã¶GÌŸ S ¿ äÎ)&Œis ÐE ÃØôÆÒa ’¥QNæé ¶ „=} âò<½¹ »œ .ÿ
† ½ßK09ȱ·Ÿà4åÙ 5 ¡• Üí !>p蛩}*´<®Q•¤Ø {m@ Þ'@.ÑS6Æçg£dÚdéä]4R« Ÿ:q¬ =J½oØ%rŽ8o éPÉQmè¸âá ®:òïØbü Ì ÏŠçg³±£jJ I邆”K #G¨Ÿñ
~_t©Š S ¸ªÕ[wh=@ü5× lZ ¬ îF¤‰åüâ¹O‰‰ ± =MíP#êIÔ]•© Þ¯½Ó¥„ÒZ“Ë~e*sç G ¢›¤­v*J’ ¶æifÁaéQ™â‰¸ç! ,¥%ý®©(–3ji! ¡jà½hWÑçk#Ù×W=MÌÃo²
c‘è‰' q Á 82±®®à‹© ±IÈ_ ¤éèõ ù 9&l(s)¥àß ­O b& y±Ù¹øyxÇ 8æí 8 ©f©¥¤œ=[û¥°kô±:Ô7F¢i˜âÛAÂ÷Øc aô»Gr € SXÆ?áÈ —ІnÆu:*nòì¥8<ÉJríÇ×
W<I{XCÒM&2>"‚ ‘ ûmƒ ID|PO3('Eø9‚GXW¿Þ-ùUì ¹O ÿ OÇ ÉÀ Íé"ㆠûr¤íÅ ˆcCò* "«ÑÏVÌãá›ýIº1ꦵ!g[=@ÐØ Îàb <‚ =@9È#¾ 4Ú²žVó P[çq…ÄJO
s¬åÖÄ­ ™‰ÐzÁ ¿î[j#³åù Œ²ª¤&æ±»ù¥r iUÁ¤‡s×u_øòÂCt+ÈÅ#¯ˆqŠH=} òÎú)HÚ¿=[ %ðso ¥™ âÂ×tÛ3 E½J¹ # 8(¬~ Î ¶ e0Üù¥¯Ù†³¥ þ!hæc=}# s›à^s
ë¦(‡P   =J  fœ ‘=}ÁQJ‡ Ý|h+23ê1 !# ÒØê`¶J L1qpºÝ zê¡)XM²e·J È5(ÏL ¾M°× Åö€J, Ô ’Áø­ ›µ¦IHhƒa Pø7©Á Q•ÑÖÃpÝû^åÀXÿÛ#ON !ýܬî)c*
å{™†¬Ä¥_G§ wñ ‰¤ ¤ ¥Ù#ùe©BÃF¥œÕP2ÝÍ ]Ù ‹Ã¶÷¨Vº LDz  Ñ ,™ Í † >Îð=@IEsHí 8:Ö,¬ ‡0Ægâ;tPÏcG U^Ù®í ²Tõ Œq.Ih°A Ó! Z©±+ñ¹ÒÜW!× œ
…‡ ”çe¤%ø[ ½(É è}ÖbLßãMy¿ã &H\£æ v^aZxæ-’ÿƒ O=MÿB M–¶» ëw=}Î éIw» •p4$ )1[\ `ÒË**
=yend size=13016 crc32=659bece9

Hongyi Zhao

unread,
Mar 18, 2017, 6:29:02 PM3/18/17
to
=ybegin line=128 size=31122 name=sudoers.5.gz
Iµ2*****,-÷Öóù pº(¶"?›†OºF¥ªFe≥ø ÏL耥L?ºt`· |kÍ∫l.,^ànõï©&g g]*rd≥Y Ó\3ˆ ı˝Y] ®¢ üif} îΩÒµ%|G∞q ˜≈ÅÒ"=[ó±h®©& üq °"¢$¥ê
& VµLü Åõº Ü'aß Ù¡È±Éø¡‰2¸ò¬W)tÌ£ªï«Y=MÃ≤›~ø√‘4 {K=@ “è@Ôù&EŒª¥ È=M‘˛‘Êπ5 é úG ј›F-`vì ’÷˙îG¡!4˘ ÷TˇÜïØc!d °EflÚ≠fi˛{q◊ [∏û
=n¥k≥IÑ/° Õê|À £ƒøõ“√3࣠›ïâ◊ÄdÚ ∆‘Jsíê÷µÿ ‹Ÿ–=Mµ ˘(ŒŸ0}ügC)^ • √iÔ!ëÙI ¢∫©]ÂFy~ôZgI$≠’” ±mØÉ=}©^E —v Î |w$ '3 ∂[7.ï Õ wôZ§
˘]1Å Ì+¿”S“=[/=}„ y¯Y=[Ú©aB8êÈZ-A≠ “i«†kn∑‘)}©^}˝uL˛=J áâ71(Âãâá∂QvıI'Ö ' ´i ™ s)¶=@+7%3ù¯ÒÕì)ÒE˙ÌBˇ Ÿ&!ÓÙÆ—ƒŸ‹·u©`Gç 3†bÁC¯íQ
AΩ=[øD∏—Óʉ√ €≤i ìd 2–—Gˆ ≠Ô3õ πÆ” äfÃCǶ`=[≥Ω{)'ö Ëid ˝ [˘¬∑QB¢]_=}dÙ…6–fi "êêØ_êÏ ] 5 Ä+Û. ZI'3Æõ ] µ‡t‰Ïx —Î>ƒ=J·ßü∑ 6∂ =[í§ù
®ì zE˜ûøœo¿Ì`ã ’JY?6¡Vfi— dØ≥%˚ç∫∞¢i˚/∂YÊÅ £ ’8ıl¿Ü ^ “Ì»i„ π ¢'bÅAÉ8•ü}∞⁄!fR›Fx àµ≥.œ¯ç«*+¿uˆ ä·(oq ì.Ÿ8@„=@u«Ïc‘ GHܶ Ûı=Maô∏
yπyà…Ë^E o l ∫ô˛Sm/ÀnŸÓ»•=M(é‘à• õÀ– æ”˝ ! ˝Ωˇaà°§Ÿp( ∏¿‘ÍU«çyMj™»1 | ] ⁄Ù=MúÕÄÉ<ç—’ŒÑÓSy — ΩÎ_Sı≈ çi'ƒxï^R¿ ˆ”X~jÍΩI>ò ôø
ÒπõÃA ı≠º ≠ ô¬í6ï| ¸¨¿Oˆ≤jm—˙«Å<M ´$Ñ¡ ¿≈c -—dTÖøÍ=} Ò∞ g # WtÍ‚èÍVn‰2+≠åAäi≤=}$Ó˛—yxÿA-õ˚U© k|nÊ kÂBUfi2Á ©+ Ò å…≤DMgÌ=}:]˚+∂Ÿ˙
Ç I„«¸wÃäœàUíßÑÍ帣ʓ≤X9* —ù∞ Ñ√p†¢}j¬Ø ô2Ù" LF..—NflËπãfi∞i\ì$e"§÷ºñ€  n3/˜t‹J¨ Í 'æ3ÛùblцR~Óù?¡Í >L//ƒ_∂ˇflÇ lP¸ìC DKw 싃≤aë ¥
ûB}ñR‡√≠l]œ…ÄB?¡˙ùíÓfiÂõ3¨LΩ¥‹„8Ö fuºñwÖ‡énœã∫Ñ– ∂°ªdxårYr˛õ`…AD`.1xuy`êì D ◊hµñ•j∆_â†%;∂£ wuJ=}õk´‡ÄU„\ÊgêµojX e{耨û Eë TÚA? 2
’ñ)∞«£ {Le3n Úûrπx◊/¨©<ªj<é9˙}Z±ZÇ™’*C¨÷ìÀ=MZ ±Yè:%îÁçü.=M˨” ™0 ıäm èâ[ >Ø0Ñ1fiB*E0Ö¸ J˛ ®$SÇ¨Ï …¸∑•≠&rÈg£üú >\ï ∞;ä˜X uoflÑèr
ÌLå,ï¡ÎlGŸ=M2 "H"3ŒMôËOSÈOSœÎ|eBüŸfufiìúNz y£∏Œ‘3¿wì›ä≥6 ˚í˚◊4÷Ùü#≥ü )ÌÙ∞zÁ‡?Rg áÊ# y÷ ™ ø’b§µÈe︛˘Ñ\Ö—Z=[ñ¯97?O ˚ú¯M∆Û‘™¨I b
ßÚkz7§ó @äò€±„Ô \·Ú›î s ¿ {(0ï\£˙}±rÂ=[ÜËΩ–∏ ‹Ö˙πG∞# ëõˆÀ¨–[©¿v;äÌ< 'BN?ìÂ…⁄µ<6Vª ó± ⁄8≈ Ç—d»3Êc‹È∆¬∑C¶¸TrN $?¢u{∑2g¥gP Œj √}
ÿiÄ[J}‘ è0O∫?ä1_ww#ı‹˙ÛM c=[πQE¿Kpe 0v$Z%ÃÇë£n y‰\UnàVƒπ˝Ò ´*¥◊7≠ VUC‰ WåÙl¡ GıFtP√ºIflP ˙á=@„¸gÀÇ6:úà @rVp±H˝ zº ÿ°ΩP=[≠∑[ >
,âçàuñÄvà≈P±c“b∏Jœå°•1Ø, :ÿÒk¨".£¢ÖÂÓ∫mZmlbR∏ƒÌSËk.zÌ%Jáä}πõ=JÉnÀs’_"œYlùfl ⁄Q£Öœk´ NÇä d£vRÁ ‹gLoº A˚T›D]=[|lŸøV ô˜´Dé[Ò2˘M†∆$
e º}|> å`Ï ¥Ù0r8#êÛ [Ø‘J¥J˚Ïùs~{KΛ>Üîm -ÄõZt-Ùˆ ≥π@4U E öï•| n†zSCG3vÛ¯qCa=}Ú ìo¯ í ÛÓf ¥÷e_ñ)EÆÉxÄ8H zQg ùä8Y<ø¢É¯IHgÛü∂P-4
˜Ø=[Yz“ùÖçƒ=@Òä®"ptV€Ÿ{ ê,¨ÅÖòQ‰÷#K·‘“ ∫Wu%¨ !Ú ÏW‘ ≥—˝Òb˘|∞ÌÒJπs˛HUŸ nWç0VQsz[º˚óew˘ Ó≠⁄.hÉqò \ïFÊC˝=MÆßãw‘Íû™% à –”ÆL©Óí uõŸ
Î,c$«=@”"EOÊ*çbw CSÖèíÕ-`á7á]阒Œk ˙ä]5fÑ ¬Œq0flTs5Z oHVÂñ_Gü9Wf<( =@{u|s¿gJ`ªJuºÄæC75˙C∑Ù=@  ´T€œGÕ˛Pãˆ=J0˛€rW0V@O|t∏p/Y{Ì1éG ù
[x”uO c€_ G≥Ué’m- ïbì3&] :ãC E≈Ä dRÜ ñº;≈;eÍ$ä¿ é≠» ¨0Ò ã : *;1 Ú|n"ZÛÏ1úe<A£ıM&ºv r=J¨#—æ≈Äñ ÈëeßkG¶‚[r˚cYséõ@õ +8JÄ+≠˝ Hb◊2‚’
>,Vñ<:õ˚ tΩj ;–±˙˜Â∑/¡¯ÿ∏,Å2Ç€<eD4{è„ ¬|†”≠~ ÿë%9 1æ&µ NèôìÙ;x`áA k @ IûÉÇça∏ lK~_ π€f<0VGd  ÷ãsN` ñ`°g;Ò˜ÿk¸T „°És D∞Bs»o ÿ¸
-B˛ú/FhÆ ÷ ÈH(Ø÷›FKŸ^_$–JÑ J¥.vø÷ƒmfª)fiÓCªíf±Ã0K ÿT/–2£b¶ .=}C lPhù» ¨5 ∫t g•Q÷€ ~ §:XZlòõ‰‘.§ãg" ?èÿ≠O_æDá5=}ù]`c≈¢< pØd?7‹Ì‚Ú
π ·vÈÛ$◊ÉÒõ˘ªâCª >¥v©b®©eBá ˆé‰£\Ë√˚M›-N>Êôò ÚΩpÍ –[ÎÙË:LZπ.A€´B Óê ≠Òbı ]ó¢úD=M:Æ˝˛ 9u=MR_ £»WG¢H>◊2@öÄ∑⁄C≈$≈„ÁéNu™d•7£? ⁄ïÓ
ä d 3À – [ r1≥∆Q “ÇoÌZ«áã"W_LVî∫ƒ∑PáRé““≠Hù“…∫…=})ÊRÙIÁ R ~Ê.M7H2ˇøi"1F4ÂE,»f \Ê÷ö H (ˇª^∂ƒˆΩeŒ[o2¯ìÜ lí˘ó,S˙ †è} ÿ l∂flÚ‰ √w]ê
'Û?ë–πäé†ìhà∏Ÿ$ =MøiBƒπ˝ı(˙®∞K|) ¶=MrÇ© ¯⁄ÇÊ3øYf—7î~L—∂ófi ç`Xc±ˇ;`ÛõxÉE∂}࢟Ì1 Ü k ø˚–wër” cüÇI+ÚzA·¶Rß B ió]≠£Uµ"fi˚Ç.—B‰ìñ≥T≥p
i;KU(M≈≤û¨v˜ò≠ÊÍ’ß Ωå,在ŒK ˙¯ ˝ëÅ— -èH°s:h∫~‰0_Œar⁄ë%≠ñ(†Bq  ÄtLmÂM pxÇ Aì±›+˝ÇöW$¿jW ≤I¸{é⁄=JXS Ï∆ ãïJflI˚∂etË•—´ ì #.¶HH£ÆRrZ
ªmn0ïƒ-[∆Uâ ƒ%∫Í√ p /ÔÁaŸ¸˙ÉæûTÛ+!]Δ¨u§v»µg€ ÛDóÙÄAô<;j¸ h,QN—h(≥UÜS Œ* X¥Çæ≈^ÇL]u ´‘ª~$-~˜/ "◊;1 ΩÁ•ó†c>:Å£¿fi ˚ûëô˜ ¨ R∂º
wÎlÕã w|o H”’»»à æH<ôÊáıƒ+m[ÑtDèËj˝ é •ãzœ!ı⁄°ïÈfihx ˘≠°72≈à %◊£Í˚«îflφÕı˜¥›’Ñ8 é=@Z òÉÑTflê„ZãMU∂:R ùbíµ‘ ¯HAà ◊–+© x¢(Úc | ùòt
_qJ0yß¡ÑÃÕl˚CB‘– l˙À3@º√Hªªˇ' f÷8Weˆ LÚMÙ›◊’¥aªó`ß Ó ª8ÌŸ±(Y∑Z Í…ÏuÌ=@ñ衃`Û9©Z ¬"唃=JÌËv÷ÍqÀ^çÜ∑–˜ Ø pí IÄœ‡q î÷>Í }<¯w™'Ç˙
jE{ oˆQ≤‡ª éÙ#ñM» c ̆b[—PHÌpäd… æµNKÁ∆‚É€‹$bÁv\tß/ Ê_çHÉPflö<x=MBg}B]ëÖµÁ• =[ Ë]ˆ »0‰fi≤¿û mTÂüÿÅ2¶ú¡ 6l∑3ˇÁmR</>Ô<·ë :_’ö Àrª
fi˝»Å{q≠JÆ˙ú7 F≥Í©P.á }K›N⁄–Ó~”hœqÉ°ôÄ2 ,˜R3Û≤® ~fiû3”Õ~2 Ú¶º R7 ~ ∞mbMÛcˇ>Œ€ŸnºàpìÂQ√ì¢ ¿N ıJ°ƒÿ≈í°D˚ØÇ iΆ ƒˆen ‘bH/ xó œd ÈE
á™öYu9tƒ‰4å Òò‹¥·}œù=Jg~J°õ>∑)ÎJ FçÎò;˝≥¬=J“≥ 6KŒ0ã´O¡å≈~(tc çØåÅWTò ëv=@ÕI _J’5=Mlÿ —j|•‹4›c ˘⁄• |a+î~r3‰à…‘û–Ä Ãb≤ä_hÈä3L]¥T8
⁄5 Jˆ X‰G”=};í;F¡°2§ëëô≈æ(-≈nT∫åa—˜YY ·UdL0 W õ%…T‘ÏÆF˝=@’≤„1 å÷z˝ ó =}µ¯í}܇`Ω $Ó˙Ω ≥ƒ üR2Nz›pfi¬3 ã‡r3 cº+˝’NÚS=}˜á¡ ¡ª!a ÖÏ+
ù–Á^S=}º;˙µln.9∫«mw‰à¡ΩÒR» ®uÿ5w;Ëüê#t¯VK 9â(˜Âú7?˝°∞ânº—⁄T“˘ 8À Ék;˜«r} ≈@FâÛ ˜ ÿ∂‹Ä˝∑7bi Øâ&I¡◊”•)pò’ Î:_ç4q'’iy« ì Ó˜ì˛üj œ
fiÔGê »∫^ äÎGìcÒ8À ‚ ûÊflÿ%Ζ¡ €l4≥F $Õdb ‚]ÜÓ5‹öxõ{ÇÔG⁄†”∆ ??& > ±‹ø dflA X kIG†CvŸ "c¸£Ø∂\å a¬©à¢-2Ë C> =[äl±L◊Q¡ju£=JƒK ı^\ç
ASf£rhßzΩhz˜ü89¯8D πà“)¢Ù'cíZö˙ ∞ _Hñy÷#Ó§ A√Å© »Ä /˝DE=Mì !ÕA» . ∫ı ≠·ê]m‘îÁPÌ◊[ l0_¬ï∑ \ŒÎrï2i¡K&∂à(˝i(…©G ˘©»FÈ# W¢flÅHFÇ‹=@
Á`é≈^Ω8Ñ!í=[†p√dŸ @ ÿ¡—G( èq  ÷⁄P]=MO ÉûrÏò_)¶MÌ-Ù˝·◊ˆ q∆¶‹µB©Í@T‚õx„‰lìWRS! 43≈¶SŸ2ÛÁïNè1&[{·ó¸~°¸kÂÅ˙ G≈¡£ u Uô˜ e~p@Æ ûõ±√òÓî
≈˚ {◊~jûàçZ´Xzü˛ŸCA–¶ =}ê3°¸√Ò›9â=@˚ ù˛n)¶Õ¯ƒYâÛ˝ ◊e[˜Œ,∂\8˚ ›\X„%IÚ;òÌ∏¿ƒY`tí ¨* 7ñ∆ ◊ ö ±IHûÑ»Ì˘Bb(ú l¸x,fl Ü® ∆t ±â2F f®Ë ]"’
~¡…B©¿êìøy·…§) 7 m‚‡ùQàȆ* êU{|˜˙=M†V D‰ë¨ÊF ñHi√hŒ Ø_fÅqö;}Ë ·fˆ∑‰H™ï°¯A¨ c¸NtßœO±,ˆ4ç ÓŸ¢[ #"0≈(Ìı«ˇ «óW“ñ6ì™,Ù∆Éú±±v˛0
@£ˇv/¢´9â(œ¯ı=Jı“GÃÚàÊO& H≠7Y¨|·5ñò ã˚I‚4Õ ¨À U ‰3 XõL }|ùî ` ÖÖ’ C√“¶<≥√˘ ”]j flìû@'D∞ C{J·wb ˝ =@÷‰ù .—,πÉV± ”`!/∫˘1UxØñqÌ I?˙
P›–ƒ¢°™·ß£π@è¨"¢Ÿ…" yqì <=J ≠®§£L°> dI?©»∆ã‡bø‰Ñû ǘ ò‹/hh>RâÇ[\˝?í ¶π ÷ì_oÅñ∫Ùi+ “=}p{≥súvr`Ó»RÏ∆‹ –‹Ü1pB™ œˆ&˚…TÈëŸ7‰Ω◊ Ø}„fi
~¬ ≠° ¨™˚xÁ!Ê  iúj≤\î¯∆”ëâ∆Ûı;»hï9P€ G!!µ≈ ¡ πa(öö[ !‰Á=[øiB_—y1g»^ghg®£&˜’=M ®!'≈Ω˝¡È =[√ı¨—Ñÿyi•iC Ü ˙¬“ ˜%Îí$∂•# ¡‡‡%œz
-Z.=Jí+sÿE/wÙMM=}=J∑èz,G“e~ olóã=}CiöâÜ÷|Vyöì…Á á∂ ´°q n˝;. é£~¢¸–Zw pGPÖåi]Ò| BÖª⁄¯#b⁄Û U3« K€'¿åç]çñÁ& J#≈Î °¨ ô1˘iDT)äÚ&'¬ D
˚ÚC·Ãïmzû—Nà“ÈB<·¨Ÿ®4 ‘> ªôÕö!†}~∏pàÜ· -$˜≥◊÷ø1”òó=JàGÈ ºvv ÿ?a’"˙ÌB_…AsNãm {’ •dæ√q {Z¨>£23H[sÙ¯2ÿ∆+ çÑ˲y'œüÜ Ñ µ/s¸rZ ª@J
! zÉ¿MeJ| @M_ Ú4xGhi€Jê óMÍKúHóc´Uî ò ∏¥#K√¶Õ* 미 ûZà ¸g„« ⁄Q≤ ï¶Ç0ÔÌ˚ hM9ñæÊó}’C&ûL ¢ØÑ1 @I'∞Æ ÛøQÈ≈•ˇÒQ‡îq à. !Fñ$ls
u]èº6—õ†Á«.cU≥‚? d„û»¯¸Ïú√cË=Mø ∆°ƒaµäÉIU«ôv§NüxºØ*źÓk P C ¨ûÒ °ó˝∞ì æZê>◊ [¡ªf∫Ú?_gŸ–ëπ; v¥Ó†Q˜âo€q &êaÌ˚[µƒÃe ®> {m´¥Ö÷û˙é¶
oÁ¶'‰ï)»∫$ "ù‡ =M ≤ Éüh wF/ü }üA˝ èÇ¥Ÿ≤ˆ·Ÿ∏ »öó ∑ c„ °ÜæEc©=J8Kˆ—˙ 'ƒ˝˘ €' P >≠;‰`çÿú ≈Xò?°◊/=Ma˛ZÑ 'bdoS’ lª˙ñÊπrÈnåò`MÔ+á;ˇ
(œeê√©∂|•Ó\ âffl¶5¢ÛßÌP¬d%Ù|(œYXJ4•ëú  ®Z1√üY⁄Ä∆°$  3(e ±ñ¡Ó ª„˙t/ÂäNèÓo=@õ¿PlÀp÷≈N=@¯V√=M∞„3PLGÌàmR B,Ö÷ ûo Ìt Æc·v˝ç›KÙ§ ∫ ©
% `ÿM …_©ÔÇÂ∏sEÆrs‡è„ûafir ønÿrc¯Sˇ:Bº=}+BB-∫à =MôÈ—È®∆h]-º‹« ‘w V:¬Ò£ Ò â·é ‚dYoF(è° å ∂&f…/„üY≤÷È∫ — $O¶!˝ë9»' ›V Ì7ôπÌ⁄
ÿ%˜o=[ =M%ccfl ì •"( Y§È© Œ)$˘°H$ ÔÅè<»( r¢¶s< #ŸûÁã≥˝«2Ö◊}ë πÔLíØaà=[Û'%…ö› ÜaB) g£üÖ"π’oÇñü∫í â MV^ÿ¿!eioâ Ó≤G∞ t+6(Í ◊KF‰Ê
Èå*Œ˜Òç€Y ‚Y=MÇí Lp"©≠.À¡ùnÙ˘± ≥7◊vªjπX=}i ü@Ω◊XÙ1ÀKz}“} ïVÆxOb +Iæùs…m∏\¡⁄fl;k9=@ª˜¿è’4∂f4ù ˝I QÌÀ4QÔ“ ≤8o }5⁄ C>1È Ó◊›(˙˙Ó
ømΩºflQ/#xB\+è∫ɱ›#k¯@]ÑE9ç!Ê√R›õŸ7\Eõg 4õo,‡< o3|1˚R{ï•ä‡kq+G'åÑ`’˝W· b ј`ç@ÆÁhM∂û˚^üZ rı Iπ+Ì∫K@ ÂvΩ? s⁄ ÇæL<3 r>/ ºBFÅ «ÿR§Ép
ÀGË•£ \U@<&2Á F‡™eXkfi ¨zQ1YÑ=@«t{ÄbzÁ<I∂`d">Å9ÏshÍ—— √ß$”é*q®‰‘Pı◊"BπjLKΩ ;p¯Zf¡9⁄h„ÏÍ6^dovQ–qL{ ™M°ı á„òçÎ Ô èé˘y ‰ ¬Pc—Âw`Æ
Y°∫8 áV≈úú0€=@wí’êWÍ∂Ã=@QÎ=J* ÿJ ù‹LÁVˆbï „5#D©D ‡≥¨Sg˙MN≈˛8x§ê¬õ:xíŒbfläfÉÌπÈ §R ÀjIç‚∫ Œ|ÄkcäI%øÏDN%m˙Æõæí±{¿+”>™ãt–∫”í5Œ‚˜
;»∂§ Ùöø≠Ö¶|◊&=@∆ ¨k¯T*(7qh%yöÙ =MN˙¸ 8éß√Ê´Æl9Ò˝Aπ ójæ˙…^>úÚ˜Ìp "å7¡÷¿ˇ.£yã⁄ :å ÆfYë4Õ Ìu ܧçPÉ)Ú≥lzfi∆_˜. íÄ˝´û˘h®(Ø®6«˛πÀΩ =M
˙\9Ô∫GZ¬Ü…√ Më)‘ =M Z‰Ö&Ã&Îì_•Zì‹˙ ∞&„#V £‹ ıõ=[ ˚AπÒπÈ hßܶcXyy˘Hi£fiÁ'‚¶ú “ (&{c$ Òπ‡ÈD¡9qπ°l≠wª=JÇ=}8nIöl¿¨fiÆ,¸fàœ¯-MEôì
•íN€yfi$∫)YÂ∂I¿ )# I=@Ÿ &% #Åâ¶#ˇÎı Ω$Ûë ∆¶# i gIiò(›"!)¶ ˆ ÷≤¢«^b#í… ,N H–ISZæ<)O◊Àµ F{û¥çUti•àXÚ1˝t Å≤ÿVvw)}*ãflZŒ’ ⁄¿N_·∫ˆkS
8x/çSÎ¡È qËFr7>›2Ø.jê Œ^≤=JØΩΩfi'k 2Xºâ]%¨[y ¥ª|≤Ó∂u¨ ˙$=}"”¬€ü=[ZÕé—ªOIRÏ Ñx†‡B U ,z≠˜˛∏¢¨]@¯ïH0-Ú7ñΩ£°Ñıò˚Ko≤<¯F«˛y§'¶=[ y(
Êk·á%˛/<ô Më≠ † )r«⁄Û,ãıÏ! Rí<}t Ωı˝ÈõÁߡ! 'v–¸ flHo⁄™I=J3îi˛á áX Ñ•;ñF¸†„ßÕ :¥\ëˇ6 √v ö1 k(xg%F 9â∫{n¯˛ôcG±,3}m …=@üb(cìÖ¯
å q*ˇ¢@ùødHÿ=M§Ñ 1§¥=[hí≤•JìcÆ ì√”êÅ ï´wß9¶—ŒD2Ü"1¿T◊˙Ü=@8˜K~+≠=Mt ïüTqbM∆ÍÀÛ  Æhh˚s%,Kº8#,m3¶BKh_ ≠Z37 ∂Blòb` ˘»É ñ Éÿ\Y0vw
á ´"1„ÌæÙÍ,Å6ÖI ∂.Jã]xêuFm¢«w¬Œ…=@¡Oÿ»™j≥è5S«¢6=J€fg∆Wkgx ∆U≥QØ óLÚiînÍøh ›‹D7J»]≠„Ê⁄î˚VÔ¨k¿¢&≥XhçR€S ƒogvÏè¥˛g. ¸õDvú  gdÿsh*
û ·gj5ù=[n3B –K∞ T(T¬\ =@∏ “_·: ” : •èÉ& h†È•»5∂€© ¢Iíõ# ŒbÒQ†⁄íFˆò&éÌu © :[fi& y`iÛ\)v ·=[Û ÌA%˘@ãµ±≠R) ˘q%˘2¿ Ûê¿ e Ùűq
ÂÒÒ© •¥U' ű%i i ˘$”Waπ!y â'  %ÈËg¶=[ y$5)ˇ *ın˛UÖâÓÊn©´®› Á{k¸†˚ √ç#åâªSKovSPù=}z®\víy¸Y≈=JÚ\≠* #N7ˇg¥|f ˜ C≤\7å(ìµÏ+TæÅó2« **
*’Ωrâ∑Ï{zé fiï.)0∫ Ã@Ω C Q ∞È—≈ ∑ã ÃŒ:Ô ÃV ≥πŒËƒÎíØ≥œZR<≈n^qP® ƒõGP[r¶ 0˛vÊ˙≥1¨a ≤=}à N(P†_ØKLÅ<V˙WE e:)ïNC=[‘òØkSd éEØè]Zù=Mêt
È˛o√è÷pp∫s´˛∞ ∏£.Ï¥ªs<‹=}ß?©ÑZ €ºÆÚÎCÿsi ÆEM =@÷FU.C≥À›ç ≥°Àt ˆ‹“< û˜Õ˘ ˚k%œfi ª≠óDs’=@ûj«ƒ E {ñø∆õŸ]A-x l¨á<yÛË·Õì@PÍb≠T =@ ™ ±
·‚b ¢“ ˝¡ûÈ=}$Ïu¡ï _Fÿ˝# d 7Öê\Q°óı ÔfÄ4Õ .Dî®\Ç =[„ß ˙¯òÖ∆Y··kØ¡ò] Î ']ª0_î– B·K5¢q •ΩºT≥ Z Û3q˙ã¨vLyõ€ =[ÿÙXÉr|É⁄yÑ∞)"& S
OH/ã>Œ îá≈î 9"ÌÂî\3IŘ¨È…=}\ Ko[£˛ f˜# æW=[F6 â VwGÕ &mìÏ® R=[ S{q˙&Úrƒp µ£'ÅÛ˙ÜÔ ˛ úµÈÓB÷¥ >™:±xGbÌ£&⁄Lÿtã ∑=MÙcÂw'Î=MÂkUé xÌf
uÒCt øQ·ì∑§=@HcF◊ v ˘m 9és TKwuŒ_=[\Õ◊sY·@ì=}ÏZî=}¬.*8ÎB¬⁄˛5 =JìM `¨#˝&X≠C˛ •'=MC«O zå w[©k)@√«ÙDV4†„aª;u-UwD=@ÏÕ=[jNÔ¬€º˙≥V∫ {±
üMºpƒ∫2¬»:qLÛb&ñqy rÙqøúëC ı‚Ç@ ˜ı飗ÿåxtVb∏˛x$aÄa +zP» £Ö &fiüË(‹ E`† ∆ù(Ñ Yı˚˛ú;}+Ù» ÷*öüDŒ Oª}Ö≤∂oö⁄ËuÉ›WÅÄ¢⁄â»y#¸˜‚«¨O ‡ í?¡N
-"¿≤Tl’§=@êO&+4œ\/™ë 胖u¨Cælôªë ±kÓë˙ §Q Üe ƒñ \XyÀ‰µ‰v.è]3 ÷Mw≠ ”êît>∑µù˙Áw⁄ Ûµ‰pó Ÿ\ 8~l≤Y—Ïb¯Øà ˙÷¬>›•n˙'∂œÔJ9ôù¸éJǵwÃ-·»
2¸ ‡ºŒ„}€™N ´xkú| Õƒ7\q~VÓbà Ÿ=MÙÿA †‡ Á´t√˝h Ñ©~πkƒ~ «Ë ö*/Sÿ!ºœïp2cUç&`=}…º€'´ 8a˛kñ˚Ô≥拘Ã-|WO∂ê V< ⁄ YÖA=M-KÃʵE†›bˆVë<Ÿ6m
|ºÕÒÀ#≈ EíÆˇ“° 3D\∂}ƒàÚ∂j@ p°’œ5Öè äû¥oõXY ÆdüA2fii#≠G0 ±%Úò+ÂR#ΩG- Ö —„, a∏flrᶠk∫E#Cü≠√ äß≈Ò…|wÄ—w#]ÉÍ=[Ö ◊íË 97æ^o8Œùo«õòù±
p∂}DS s ò~Sb=@7é–µ÷s0 ü∏∞flü?p§]¡ Ç [RL©≈˝çÌî€ì•Ô¯˜ øf§ ˆ}îW7¸–ˆ  ™ éé#o_ozµ=@ V=}ê˙Jzê3?¿n∂∑¨o∂Éí»åı jÖπÌj7›A=Jπ 4=JË’ìò "ÂÕ√ªŸ
… ã Ê»áÃ} -ÂÚÁ”oGÂRõ[3ïä… |gëµ $ åˇÜäQh› iwfiê]ǧˇg}élY¿ å3˘¯ ‘›¬R”+ù’Ã∆≥é\™Œ‡ *5∏-_vûÇ0^)î{=JíÈTíeÔêo x=@ìãIßâfiqÿÆl Å6è ˇ$Káı ¬¯
d´@¨åıÆyNo"nQ E}π£≠ ˚dp`∏!éÁï@˛fꪢ¡åü=@ÂAä=[3©Æ¢<._÷QéŒ∆⁄Ωèfl*®,[ ,ë:ç¸dö‘æG“ôpÏkê€@ @¯£¥3 f ‹ôÑô «‘ÜÙjí ≠ k72MfiŒ™; Ô‡¬; ¯3çy&1
ÊıflçıOMM&ì ¡3x≤ R`K™sí§‰ ÕˇNBr_[¬•‚®Ä=}ØyP ∑\€$6◊`…|ˆÁ‘¿-aà¢ùπ&√Ω*L,fOÇÃC ,ìΩQ{lNU} ¶‡Ñ=J2\=[ÚÚœ á7ªÃDz›˛oÃ≈5≤≠∏æ„÷=J9ë Ä∏!_ª°nÇ
¯Ñp3àúŸ3q D≈Fã≤ w≠ ?Ä≈ÍÀgπ¢¶ZÍ( S"]·VYX÷+ŒÌ/c/ =J=}≤√ü"@mŸ ≤™óUÍ ^äàsà ÓøŒƒ:ÄΩ∫qª†¿zªÖ8Æ[Ä¿ki}å flÀ.룫cGVX~¸ÆÇéBjM[éÜZ‚…≈¯¬÷<&Ø
aî wÚœÃÕ…˙r~]ô&3ÃÕ F∏ˇS?‚˚«Ÿ>ªÍÚ~Ï-.8áqw¡9ÑÓû<Ω°∂®ŒÀU—@Eœ ~É4 ù=M «•¥ƒDEÿ–óí vf◊”Uø›ÕThä°kgœ≈ÑêonJz+º Ùò©®∞ ) › 4‡˝ï û∑¸Lh Ä R
®/ ÅìSπ.‡no£® #ñÜ»hÉgDNöıˆr›o◊å‹8ã¢ï¬Ö√∫Ä:b=JR C%=[sô#+'é√¶”fi~Ôfl_ß'¿ ß≠≠ÉfiÍ—EˆŒ°ÁÛÒT◊ÇPär•ø◊ úò1EDˆ K∑¶ ·Û =@6‹7dÓ#6 …∂Øa;˚`π˚
4 }Ccáir»nP Öntâ ,‘¢ÃO=}¬W≈ÁG◊Q!˛R|˛jL≠ΩH¥3 ì•I q '•û|H'+ÁŒˆ=MäflÒfÆ`’ÕuåÍï6&«ó> ≤S°ÉÍ%f”yG∆ê]›ÆM‚uß‘»À #*Ö≠∂=@hûÙøí}É»3õ[¬˜w
)R £Ó≈^&£`ç =[ÕÚù≥V˚Æ &¢√ô˜°‡·I7° @∫Áã±.’{ıv – ÆóîwCEêêåD_¯*=Jrô 6=[#˝»qÙ >P†œá"¡ ö" ¸rêŒÛ =@˘//(=M◊I◊ÈA±.ü ¿ë&~ËÒåó &ù(h∆YOó+
Xs{ı¡ª‹Ä » ø°zÉ,dê‚)—4 )ÌÈÛ—È* Ÿ>B©/ßµP˝i·kBw¥p≥œ.©P5 ˆ q>„Ë Ù{?ƒ=[ì¿{ùѨt äú> π}õÀ W z¢Ó Hfi+Om5Ñi›v! 5`g»èî ) Y ◊Ôé®{Æ©)$ Úy Q“
9ºŒ÷SUÚªsséª.⁄fi‹FõA>ûBÜ˚u*õ9ö åc∑É ãuÔvªøm≥√*≤U+#˝  Ôπ>$ÂÀŸ‘êÒ «”ƒyé≥º•Ω( =M¯¯≠!ÆFÛgßÃ4Ω∏L ä‰ê√Ad0>–’≠,yõ  ô¡K˝™ê¢∑∂Õ/”£ Ô fiÑ
X2Mÿ“wNÖ.ø0cL{ítÕç8¯ñ =MÕÙ≤˚Ò ∞•Ï⁄©MUü˜∑◊ܧœy,©H# êöëùeìZfi‰áü¡lÔœ∑54ùà•óRêº7Í´ÌÃ?0£_¶ñË®∏kö≤OV 1k]®:xÔ1} ŒfY≈‚Ü X‹ T8ÎwYªäx ç±
ehJXπòNº% HS CY¥[√ß)OSÿ oßDû|0…âìK6l=J¯Ùv„900r’⁄·ñ¨Í: ¥r¿=[|ú Ü’ã≠ M =[ ∞Ì7∫Ö[_BÊÏ5MP*t¸X ˙ ? ° ˛Åu…îñ´:+ÂpmÚKØ S=J}JáÉX¸ü…!Y
$†ß^‰fi«c–Ö‘¬:si ù‡Y≠úÄ VNfl‘π=}>õ ná jùWo ¿ƒTé t¥À∏{¡Ew};öëq£t…¸—à”I5JHx.-Ë ú€Z’)ÃCÿD7˙YˇL=MN”äìB∏ZW·]äN À˚⁄®sÚVuÑáß>ÂS…®Î√ -
˜ Fê ÖWπp—3>ôA Ô9Áô;!y·^‘§Û&≈r Ü°Ì∫3Czè˝¬Ë•ŸÛ Üû uÆ¿Çî‘zÓ'¥ü ùyËà=@ & _Ì>.~Dµ[¡,TKπ ‚˛zäm6yÙÚY–”!´¨ √Ä® ä`ÀÒæqÑŸI‰aùLƒWµ¢J˝%fè
ü§1ëDºI– LUªT7∞t CWf•ˆØ5u¥$í ’éa=[h.â. so–§ #¯ÌQ#÷>Ü2⢕7Ë-™}< “ÿ4V sá˘◊:m—L“©»4g’Ü 7ÔÎé˙=M¶\ ≠nÀÓ»õ ?PÓ‹Óë+ #‹¨¬ Ã[Xörπ=@≥á
6¢l uïë'Ï ÏM â¡6¿∆RfirP]¸¡_ AºøL_á v*ß—¥fiπYn 8åÊd… ë ¿¶¥Ùwé≠•§>˚â lÏfiLº Ωõµ2p$ß„¢â`ÊêëI‚ãiËr_BRõ3˝Ë ¿òÌ=@ Ú%G5!d# x∑Ï¿ÜL4T_ì±=M
VÿIu#¿˙ÎÊBÁ5‘6cMÌiFïGY fiû;’MÍ™A7 A10ƒô/U é|Ó‹˚‡ ∫‡®ÂÊ5˜u•i‡+v≥ü≤у£ü Ê 8FL ‘#Üß≤ ÌjÒsj˚wã '…6#Ø∆¢ÓEõ¬B¨pKr˝QflwÏ=[◊Ræ Í{·Ì˚q:ª à
ˇéLf fiŒˇÜO<u›^E— æ¡s#»ÃZt ÿŒ¸gÁ•⁄Á ¿[ÛPY#ãÑ=}Õү ÖÎQΩoªAÅRènŸö¿ZÑLàDì7Å»Ω§‘Áó À˛´JC›U’∆ÜAçl Ωòëتôí˘≈pM)Í ÂD=[ã´ì¿e„ä˛ôà$cüUi›
¨õÕùˇ‡∏Å“ ”ºâØ=}Í=[àÓ€ $‹¥U9 Äç+ö £€êÖ¸x˝<õ ^∑^ n}7Dpé´ìêBç Ê»“÷0=@<Òïö∞d« ıŒ PzÏC””Il Ò_ ≥π∫Æ’îÔ) ≥A∂LÆ=Mj^ãE3¿oœm;ˇ˘R‘ÏP≥A
Õ ≥ fiîàãˆáã\? ;ÃÄ€\ ”åˇc"Ã|ÆG·é3kÚ–õ‡‘≈ã# 8’ØT~‡ ◊H.N_¨U©}^øõîx„˚Ìú=JG =[6up~-bv-ÀÄ¥Õ7êˇ∞◊>” R≠q˜ 5|”¸5£ ÜLòI yü®€ ˝ ¥‘B™¬ÿ
wAg‚5 fi ÷d ã ë â„⁄,Gé ´ÃG£˙öÙˇÅËm>tXçÈoÖ[%∂£ g-C˜ ú— $˛ã†Ó ∂ëõ!ÃŒ«hÜu@Ñ◊Q† ~ÿ ÷ÿTJª%££ˆ8üûâ=[¶æF/¨©πPØæâ» ?´ N˝ 9Iè®ú=J≤À a÷F
€M ¶I¿’√uǪ±˜ ’:S«=[p≤*›fiLVwfó&!º˚XJ1 √üˇs,Äúx7\7Æ@¬q ì3z<ñÈî ˚d en¥∑"Q÷òS≈âîE◊ +Ïv8h,¥ÚÊ]<±€=JQK B©g=J;Ñ)fi sŒBÕ/ì ]´!U=Myû‡
=@0çü/ åÉ3Û áXĈ≠0ÑkÙH¥s=@ =Jk|Á˛êÆ E(Pÿ ≤K∑\l°:†∂PFfi3ôlM*{1í ÷ÊÙ6«; 9‘ZQ*Æ †,Ÿ?±∆ …È£ßö &ˇ Û(õ–ÆÄrƒÿÔ®∑√≤_ KÄaêÜ òq#√RÇ √CB ÚO
äM ìÌÕ¡ÅÆX∫& ó:·Q ÏÀCpñ ”ë#B8Ö3 ÎÒì§Z òw ∞L-˚∞ß Nv";‹≈L ÿCO°—p GæUsâC•ˇ„Í=[ NÕÛ´q"r_p`… ¨ ⁄PÔ®6$• ø¶«N∑Z‡º+ ¨WyŸ ª´ä]¸¯ ,ú耬
~ŒÁ ÑpåÎ∫ £ -∞È3 §X—‘ ôí Ωˆ™⁄GË;0,êo $d°ËäëQ…—kÒÜËÁ2,∑ ≥™- f«ÚϪ¸ã~$’·Ífl») Vë≤ « √?Éå# À5Xµ}Mî≈Lå¶kÚì|Â/·ß ò=}wkäI3 æ *Ū√Ó+v
Ç‚◊R£o ft19ØUdÍÆÆ£p#≈N SßΩ’rÛqàñ—ı√ Wn v–]Í"jı◊‚˛î: É÷§ı8çπZ–„pt2Is –3, £∑zÂeL73˜Î Ç».ÑË8‡Ñ˘`ÔÓåÙ¥†x∑^†g ≠¿eJ ≤ññ$§g ûDSÛûHÁ
J≠ügkèO ç ùá+Êå7H» á`¥=[´ËΩA|áa K”bró{†R‡¯> zYƒexLÎJSn)‡‘◊MBHÅ…àAGEL~€„Öf„à2˘=}eEœòú~c gÄI√.ıYΩ ^Èó €øÑ s ≈ J/òúÈÏ"È_|ç Gtv"
tŒLy fi∂‡ª∆<÷øÁ g Ù≠åèÒÅÇ: ˙#ÚèN`UÙ·–Ü0 ]MWrøâ‹ãN3 ‘ÍdLr &êeZ%Ù±±£ÑõÏâpà+ß^_=@»©¡œx™˛·û‹»≠T©w +<˶xº> S#X’ Eµ9†b"rò5 ˇ¢| ®ÀÕûÚ
Œw¸/’Á◊ 2A3µ6ÄzõR*·[à ûõˇÁ]±$Ãfl=}XÌÌa1£±–˘œ„ €W€. ÿ=@zÒé>çπÍnߡ3¶—=JêR‚XB„9ÎcãâëÑ˙¶} „_’Û\D ,∞l N ∫:ó á Ò1 «∆FÊÙz=@5 ≥âIË{ 46°d
~flg åkrÄn=M]—Ø ¥o˘~!π #ìWW£Áe6Ï ˇ÷–»XÒ»∑∏˜î Sܸd»õÔg âl”á∂YÌ•ÚiB‰N_xC hïÕA Oò0’† àzº˚=@u—˚∞TîD ~ë=[zı¬R∫‘™’ÕäJ 8£.µyˇï ~ á »cZ
:ùfl.XÇÂ6ë8=Mƒa $° åĺ l∞}ç íR âÛ£s¥Ëh °Mû¢L KÙ|: „„=@d5 <ã Ú {€O»óèäóo“•]|JîÏa∫ wÉvì“O˘—µÓÒ*d {@û≤ƒ 0M.Ë j/p> ΩÈŒÀLIã∑WÅÙ˚U{
»ÏÛ=MƒEû ÆJ–%<g’≈|sÖåd Ê7=J¢É∂ Ì=M&q‘‘c;+Î?ËÇ 6˘D/fl‡ÇXAºít ^ ∑ôe˜b˘.c‚Jc ã¿Ë Œ+∞ qô›˘‰≤Øíº√3˝ÚX&à{¸<KVÉ2›‚“”∆œª 2?X‘7 <ê æ˙í~
0_ ]ÿP?ÄÙ}ÿŸefÙa=}æ™wZ@î>?N3j„P=Jí’Xak=[âÏ÷_’¶QµLæsÙíö¨4 ¨ ƒc’‘" BMÌÛ√PJ≥∫ö±∑i€=@∆e3‹D—õ˙˙O¯K vÒ ÿ;Ø@‘ \ ebc¶«≥C ÌÎ=[≈ AÉi‚â~ ›
¨œ]3qáK‘πõUÆ"ˆÕjØñÄ=Män¬›Ã ΩkçL˛|˝ 5ˆ^ŸcLÊ∆`+≠x Ωé"j(á∆´¥∆3‡ÛfåìÎ$ƒZ4óoƒK’ ∏QSÕ\‘ÿ‰õïÜÎË∞?:ï3÷C~Oë@ ¿voƒûñŸˆ “±√w Q Ô ÑF :œæ=Jy
¶Û®¿O4år?S¯ ¥†ıÒ ’õu# fi`·® Ï |“≈ Iôi∑/Í”\ ü=@tÙRK˝N≥V`B Ù¢fl£ ˛z E¯|r\Pô BÖ3j6≠ìå*Õ·º‡9ôè' ™◊ Eˇ√∫£…‚ó Çï≠ HÄ _ÒA| ¥– dò,ùx&
=J ÕåÏ{ ôkÆ>Π≥∏0BhÓIÏï[≥+ÓÜ1S â %X’ ÷í¿ô3EFn,[ü±=M^†/+¿@ Ü Ï„:º‚å*û/‘iâO˙}π=[^z€ÓHæÄmvìÇ̶Ü8&uÛÜÑ\∫@=@2b¢s#ÿ ¶à‹ΩØÊ=[ \ºW~<oÊ 
Z\gp®˜áœ Ï‘´‚¡Ö ∏ìbƒ2>D$eX€wa *˝ aç$vFr]=[í"<B≠ÛÀà*‡Ä%Z0B x1p0ËÑ``Ó‹Ã≠[ ˛ Ä’æ ≥?Ùˇváü ¥ocãõ ‹B6 §~ mÃ{”cfgFTTÖ¿BJ=J§íZ îûû˜&MØ
‘ÆÕZ‰ÜÊù “lá  ù ï@ 7Ç'I[nàÑÛ?Ïø ü{á‹#ö§˜¥„uk p‚5˛„zãÙKôKí®Ø=J_C/ÀèºÜ1ÔՄ˱°   ˜õSÒ]âWü„¥ |ıÔ‡5nÓûæü£P{œπ?¿ πË+-o¬õ ¥tßIâ ë]ÿyG1
íCRW‚8hNOȨ≤«à=Mø ≥++#ı ƒ…\VÒU8œ¨=[è øN1Ö‘ÜÀ‹7} —ˇ•` ÿî_•Ãzó„êÕ·° ëÑg 6{rÅ©—ôz¨òy‰(¢Ê FP 4(¥ eÁäÔgGı’bûÖ\Ñ[ó.‘ùfi óÿé=M°¶§^R•Ï6
Eë\∆π é?› /´°˝m˙Yo»™±˝*‘ì⁄cÊóö˝≤C£"ì ^5SJ†¢E_ î[<Æ9 *˝ˆˆË»éò¶º<,sıë7ÌZ±˛Ì kö¨≤ôXq«Ÿ€ uL +ÍíÙÕ ˚níÒOÿæñ◊≠ ‰[Eb Ô =}ÒOöW}∫=@ ∏S
!üHÛ}ÜfluS =}ª»^ Uw˙ß „ï¸Rû<…m≈#é+<Ä3g. Ò⁄Ë â®„∞ Ï‘° YçõK ⁄ΩÓÔÒEǘZöxú©∞rcF w «ŸH8°Ë¢\ C m-∞™ /%≠≈Ì *g≤n ∑∑‹˙“w5öª/ç°xæ*≠ ‰å p∑
<¨u¢Æq ,?mU -À¿RMfvl¡^‡ !flï£*(õ"_ê€C ô ¡ì(:gò| Ú◊ˆqˆÃn ú—’˜Ä∆zHƒv¡Ωm ´A∞ fi Í W^Q•Øƒ⁄LëÀ˝k [©√Rp≈Ü ˆ t∫‰-ä¬G˝õ"œ.ΩÄá â ^=[˛Ù°]\
U√H≥[¶ÄÍs=@û∫»Bn0®JjwB9BU¬íÆÃÔ]F A 7 ‹ìĺµ≥flÖ∂¿@SÜ2 ¬f1Ü%,Pò–E5mäù¶Agƒ´wôÒ dùπYÚ 9 Ω =J('¶≠¢r3à{ÌÖÀRùµ¬ò]&0W) º ƒ1|m¨¸°~dŒ9˙6
Ñ\C—=MÅ/l;-=JQ S·HΩ8j”Á·úö4ѱ% 1»YT=}ãÑï~€ ê:ôZÌ–g™E∏{ ≤ F;<3<ıE¡AÅØ=@Ä8≈CÜI {µ$¶ ≥ k ˆ√Y %Å∞§å>ï$Í&„/`<Álñ¸X ]µ R4Xfl\jniˆ∏ã.
#ëªç ó 5LK‘ˇ /#\’ç_9 Ü Ö °É‘ œ;Q∂ ã‘+s»P?@\}ºtK˜»S=}ÁP~ ü ˆD flê =MÅÕ ˚T0 ∂õÆŒX} ˜˚¸ª flæE80®Iı∑LÅÅM#…åûå≠4P0èR¶ÂCEt {h &êxÁÈÂù
19≈aOØ¿¡ıï"À;øˇ ‰¢ =[ÖÇ3{8_~–ù›¬=@ä≠∫"V≥fl¬œäpXıoSR|‹∆@3ú c MËêà˜uO6WRcÑ ≥÷¨{[âlá>y L‹•›ÕXπÌÒ `ú·∂Ê^_¨k§'_ wÕt äK√∞⁄—7œ£Æ^ËÖ ê-Ï
âÍåΓ◊®P·G—ÿ 1•ê‘ ¶‹Î ª¯h!Ë?âêÏœΩ=M≠gSñ Ñ ßuh&6È.LèD7Õd}Ã+ü =@‡.¶,ó‚Kí¥÷µn.›˜üÌ^#0.∂Ÿ\1”]‰“=M.^Õo∫9≈ íj∞]sï≈{`6O9ä_5Ñ) §Ë.Œ
` ª`@’ ;y¥¥+rÍ=J @õ-™¬`E[ —Ösÿ%ß ºfim 0ëã\*-â=MÖ'[∂Í≤+∞ hæ º—sÈ ÃNï‡ê=@ ƒ#±ó˜÷ëïî]ò ≈‰]w⁄3fi)˙ ( Á£ æ€,JpHúÉøÅsÊHã”õBü / y\Xo°gZ
¢'V êJN8Ì√Sb‰∫¸ΩÔè;=@=MS\ ¯≈‚YÿÌOÛ †@ñ W™"ù$ •Ó˜Ïܯ 0ÂS“p÷!Ü07£ÜVG’Ïã⁄JxÚG•éÚ⁄ÌΩÕ˜⁄…XÙìC«≤Ò #=[≠)RŸflê˝ ˚+ÔK4ú˛ñÎ( !¢,7 hÀ’è˚~v
´gÑ[ÌÖ∫•u \A>¨*.Ì\ím êç¨lH ¶¢7öñÇgãQT˛o ) v≠=M‚÷„VW]¸t˜ÎÉ:‘ :J°F›ä8y \NZeXkx w¶4`'Á÷√9∆F ÙXncLÇxÓ…ßÚuyµ[«/·È ∂i Hê¢oÜL{ÖØòêo˚=}
ˇ÷ÔÈ?ız`‘p=Méä‡ù/Ybp ÓSÛC.3√∫En AÌa›D‰à U§öÕ∆ç$O˙œëÄ6v†π8O 6fiè5 ®ÚrueñÖå⁄MȇG` ph”EοÍÑ° * ›ı5∫⁄Ω!⁄{®ä©¢:©…8ì¸ØcAG(õflñŸF=@~¨?Y ü
ë’ s ±˜(Gh¢˝vØ ‰Û|# §X/ª%C» p:\u≠ûxPõ»ì¸ßÉDfl‡√’Âs„i∑ı¸=}<8VÛXÀ‡U∂ ¬ ∏ ›õ3ÖQ2Ì §ê†û”1° Ææfiѯ<]¨È?œ< ì, Ô ◊F »=[Ü &í!O˝ÊO  ‡ò
젱ɣØÖ~1í€Ee\∏TBÔ•ÍólûºH ƒL§,çhìï=@ä&—qÕ ccôNbÄM ÕµÉ,df}ÑÈLì@Õ7/≤€∆¯´¸Ã©oÔ55ÒâÿÚT±TIÍ=}s»°¯ ôÊı®_I≠-— •-¶7ÎÙƒ ÉN\©›Fª,dZDk/ÒrÓf
Ïggÿ∞´auè¢ˇ n•‹¬î_ˇæ_£˝Ò¬6øT_“qAˇé∆C¯ =@ß" ™nõõåV®Ì ûxSl≈Ø/ Ü˙¥G˝W.¯¸ìús?3¸◊du Ôw òC¶Œ˚ÉC3\j Ucƒ I fiܲÀiˇ á„& _˚·P»û n˝⁄¥Eù:∫
j÷§› ÈS£I0{ô~JG-_÷RøºËW•»@(„÷ fÉ∞√¿Ê– b?∏Êœ ∞ãœÙ&˝ ˜ò·'¨} óêN=}ú∏ œ$ WÏ‘gö>püø6 ˇ8ôÃyâ∑+'JÓÄ›n∑‚;V- K€ ⁄j~¡ûŒ ◊DÎÏ∑<$[¥H>Ú≠
=[(√d0 flhsN¥∏Cu\¡ AZÿ{ #j Ï g=J8Ìúr~[|z˝Æ˙cù ~;õ;Pí€E∞~ @«rWÔΩ¸ÊÕüıÛ∏ë⁄ –=MˆO %◊é£ PR≤=MBj Aâü <®4 Öû¥#œ¸:(ØÀ∫*˚LóÁִįΩ4∑∆‡¢
d˙f∆;T>=Jo7ë=} DÃU∞6#‡≠ÁÆÇπ÷∫œœ˙ˇ8G Ñ• gúü@fi5¨¢ÿ’U{∂≈~BJÄ1)G=M\ ˆ‘!0(G˙EVN£†0—ã ‹ú’ ltÉ3F, 9Z<a ° flñI`åyı;¨ Ç?§ ÀæÆåÀÊé˝@ú…Œ(
Ô¥¯P´ËJ¡Ùyä Ê3…é˜≤Í-<^ˆ∑àGÎ> 8Q_˚k™=@·=J⁄Z≠£APÍP4KúÓd≤ ‰®ÅD3Ë=@à⁄ «Êbı # l u`E÷wã VBÔët˯®Y”@3íü^d$T B̺á<éip‹>‰∆h°~ˆºÏ±Ñ”„h±≠ª
9§œùŒ*KYX¯1^Ò˘πµ jÆ5…™j Ê Ã\tñÇ ?7ojt.N˜Z,fi\__ø%m͆fl˝¸èS€s¸Ú\/ÖiL˝A∂ÿüG·ºP<D !€Km∑’ÀŸÖ ióŸŒb-(-æÜbo∞'/Z ∞mÈçIMˇÃm=[†∂® ç-TΩ‡g<I
O≈+Àò@ €»·X Ÿ ãçaÓ¶ØV¢JAN]Œ*µz-T=JÂr°§#&î˜L?œn Ä U=@ÿ≤ Ñ‹á ›Ë, |Ñe◊ÆÕ÷l& 1be{Œ%ÿ˜ò·∂yô”æ ∆ ¢ Ö ∞U4Ém÷2Y±/≠k ˆ(√Á s' éΩÃ+≥ % ⁄∞fiÅ
·ëØÂ4û°Û:ëiı ∫KàÊU≈ò•ÀMõË¢(°Û5)•NÆë©…Æöîî∫ ÍWÿ˝‰ß ©a≥Í‹0V∑ iuo M Ê‹–Ûm·x`í¸`eíú =Mït˝pèÆÕ Ã ˘π”∫~Ôò>≥+ì/i‚Sç zñ]cÛKfUÇÎıïÈ ÎæMt
j:fiˇl_+˜5 ÛÖÌÆ_> ã\B ÷fi¶õ\ú˜? flp=@YÏÓä∏ Hر÷ÖN◊ • $8ÿk°e+ 8 w€®€∞tlGô]o ˜Ãyµûu$ ®]π¬ lÏÁÖŒ,ÛÛ9 qtU¥i (Q9±ˆºWñ"7õ~",0µxÄA±;VŸı¡Ω
å∆ ø=@¸¸ÙyãؘΩü 7568  cS≠≤Œm‚¬Ãl-”fir ÿîF∞Ã∆:=Mb f?~ıêa”꿃fl)Í ]ú°≈V„ˆ(ÈTiùa√t‘ ÉGŒ≈k òf{ëflY<k„Iıe ' ü{∂£¡m8d éflætÿÑîL 0-ô U
öò≤éùÙ¥Œ≥ I 0¨Ø ¡çÚ˘ Í∑P“QDıQÏ'7flê÷•»4CÖú ◊m‰VÿÛ√‚‘=[¬î à≥a˙}EV%◊ aÎj =J ÿ„n äÙUïmU¡J$ k5S„„⁄£ˆ·≠·∞!“ J UFI0 7 7 S=}‹ #6L_iùH
Ø&îkû ~39OÜâ d ∞ ]‹à‹ia jª8xù@4,Z¬˙ =M~ÚH ˜· fiâÿã2”•ïÍ≥ú„R”M9€ï ≈∞ÈúÉ˝°áKÑ¥2Ï´ÍTóüh@ Ñæë* 2ENÌtGøöª·bäS˜b¬u^≤√‚¸˝ âÏ \*ÛÀxÏÌ
&Ÿì<|Ñ/æ )>2∆Û[ÏñΈrA 6ZdB8Z€¸–Ö s› ≠P ≈$ÜtÈÿ@ Ó ÷”lOUÄW∏ÇO È¿’H˘ÑŸmˆ¡^“È ∫·Ûò‘úü¡è Îõ™fiËÅeRÍ˝ ≈6yµAé¿  fi ©⁄„ úŒãR≠√,Æ¡œπ5Yy_ ∞
%„K=Mvµ˜ï¨≤Ä~˙¢Ê GØmz’ úÊ‘„ø Ù¿;Sæ|‚ y÷… ≈=@“fl∆⁄ä⁄ ˙ù ñ N“ybNÜı/-≤∆C ‚˙““flïó<•l=}]©3>∫"=J √Éwµ á±)‘ ˙=MµÂflŒº ,∆ ˘s0ÕϘ/E ˇ\
1{ó2ä’™2î≤~s ø@7L‘ÅIÁJ∞}óæ?'ïÊ¡TDÉ<⁄î Å=JC· €2›ÚÀE ∂ ÆUÔ¡ÿYw® Ï&*ê*[õ≤1sªË›‰˜xλ ƒ“M°ÌJ;^∞∏†gÔ Û2*•âQSÍ~+—÷X{® ∂ºÀ%Rº¢çYtãÎ
!" ˆ≤õÎPT±]/∫KovEjp É_’ƒ5U«¥‚˚≈P¿fl 3Éj* #eˇÔûÒ7yÄ=@Ö‚=J=@W œ⁄˝O83 ¨µ⁄·˛d ]y±'{BfÁ fh;÷° 3cWlÈ ÅaÆÙÃh≠:«eIJ N ÏÔJÄıÚWæ#ß‘ƒLÃjÃ
PÊ/€É' ≠ 3 ∏?∂ _ÙÉ™ï„;î~*÷ßΩr ∑¨‘|≥5Ë„™»5‚JÜ=[ΩPçAªqqj 6¡ é@£ ˘+€=@‘8Êÿ $∑›PÔ 2 §:∞(Ü ¬ ]öDeã 7—AÄıÊïÙûÜRû¡ Hü√.Ô»™Fwùs0ÉE˝¯
=[.˛Ë{øy¢ § b9åÂ}∑x-=M{ e ” ªªPªÿ1œº M–^G^˙ãîI ;võ_®5 @ÿµV" < È Ük|=[$9˝ ™Óo ‚2™≠ru–ï{wÄ5†Ëæ U∏~ ·–ô‘Øxì S3≠n?lÄœòâÈJleÚc\3
‡ U ¬Õs2±ëƒ›U Å^,˘Hf±ŒH±≥Bïp£7ı{2µ 3›J€A„ı>ZѱŒHÂéª-∫Y ‘}œˇÆ¯rg ¯`rhó≠"6Ê3l2êÜLL†ZY˛Ë˜û–≠ >@’E∏J∫⁄iLıí∆Ò`4∞ òí€9úãó 0WûyHˆ◊¿iäÉ
R≥mzóì cípÆM û«W3ÖÔW*oHø˜÷ %r òëkKL ¢|>4 ßb&ܺ?ÑMfiWUEwOG=[∞X TQo˙5dı¬M≤kyõå°∆A Ó◊ ´'ŒtbÈ”… ø⁄m E›ØBO RqΙÀ =}m O8ã ¿ j[˝q‚ñ‚“ì
› 4$) 'ÊÑæG°sfifÔJ≤oãÍ·0ÒLZnzl=M›E∞=M‰‚ =@OÖ¿(’° ,~^F∫ú‘¢ p ˜øºg G0≈t·u˛∑∫g‹># YÈ&|‹ë´ó “’l€bÑ<JlæÜ{àØïØÁ=@a ÊÄ\÷}&¡© ¿C±wı ®
"z? +|Ûº c¢ u≤ÀU@À‘∫ŸeØÛ=@¶ =[_3Êú∫é£:¸W3„[›2Iyæ^ ˆµ¬E A?Î⁄· ¶©0Fu√ı Ïá|_ t Ó O)ïù<≥œT=MŸÔ#ˇ÷y¿ ñ›=Mö;Ô;“.@ • yõ‘òD˚*âC ” \1≈
\‹}€ flûñ◊|Øp =M“ XYÖ˙UïÛ°=}lflrB@«.¥Ç=}ˇü∏ì 11„«ÆÓÊK9¿ Aƒ˜/∑B Jc†;b GmW◊¥ÆLjcXU;˚[C8‹fi»ôwÏÙ«¢πÀ ˝n €Ü÷pênBá:Û‚ˆrdI˛¿ò@…n¯mP⁄E%=J
…’SË YÍ«v⁄ Ó ≤œˆ bûØÈ◊͉∞¡É<e aêÙ[_ÛrˇY>4Uê -ÿ¯=M›táπ$p‰øo¬!ˇ=}2t˘“∂Ønh¯fiË‹^l&# ≤ òÍÒÄ =M)Cò$ Éb:4⁄<=J~√=@Î.ä∏4ä± 6íb¸˚æÖπË Ä
´fi e Â…9\3=Mùà Wˇ†L” ¢7¬µb Í∞é∫ùá-6Ô ¯≠ 1Â…Ò–¸êr Aoäπ:¨"†Q ≤ Ö Õ…^Ffiz2ç¶<mÉ$Ö< ∆"O ñÏÉ â=@d8 µ ñÈéwÕ„wÈ WãÄÙ≥•∑\Ñ N Ó|Aŵ=J
Tht ß<¶¡Ë€«v4e^8å;z B V 8∞iS GÆıCû<Ò˜—Q‰`u‡} ægS0-\flπMk Jk¨˝ôIëìÎèY-ªê• è J|ÛW ^ü¬T˝R≠h∂gljW˚ 'õ$©¨  “ NŸ — q√ôTùπ◊Ú$JuGªóºéˇ≈
áW_¥„g§  ö’JF‡A¿ˇ îáb ∫ õÔÈÊ” Ωœ^ØÉ;ƒ(M?m:®A w®j( RĆªû ZP ^2ÊÙm¥'ÕB•˝≈¥ißq£Yòg°U≥∏ŒÄ flU ◊"Òb∆D õΩ—“X=@.0, Aé∞‚}/†Ãîõ ◊FAŒÒª
xr´ÍO#0À|fl *§ flçRdÓN÷Då'6∞Óúˇ¬\;¡Ωòø∏qª <:ß ≤∆IÀ–% ñŒ#ÓcΩ∏ΩçÅB @¥YzªÍW+RuK=@vq K9∏> ò+flWD“◊Z≥ñêê$*Ú:U oÉ-Ω‹Ç2 ÃQ“Öæ— Çíò˙=}‘} 3
9 ˇ=Mf–û`’˝ Ç∫Nfl¸Ü Ω≈ºc#oÊ]fiê‘Œ@˜O Yœø”=}$÷㇠…®$ìVA ˝líq©¶´ fl˜ Ìên5ÏÒ‡fl∂fihV y~ıˇ¸›Í§ Ëj˛ÿék}S’H√=M˝fÕ=J√‹û‡‡ô<àʃN‡z ¬Äm=J
L=J≠ ˚Aƒfi∑ 4s fÄÏruª;º“ÎR≈º’#1~ëıQ>L?i Ì«YÈ" ÛÌqkC=}íR∂ÀP2 €ød¡Å‡1<˜%Y&ySÛìjm¡zAf ¬"»ûCƒâ˜â*‘2Pú|?Ãg±€ û5áÒMÏ/∑ÀËzM”,ñy ¥˙hGr
bO?2p‚œw¡<øÖ2l¯ÿÂå˜]=[(8É∏∆÷ˆlô·k¡~fN; `Ö=@÷0„.Ôÿ áÌ“o“º¥±5=[◊<flàS¨Ç˚∂lÈÎN∏…uÃflêäl[ßuhªî~®rHêÿF'Ñ Ø Ò aºÇ5mÅ»›Ém´'’P=[5 ¬ê˜£Ω& Ë
˜"eONx© =J  ⁄d÷ =[Ã Æ˛™C܈ Ωïc7> ›W6R.ßíÖŒ ˆÀ1SKìÏÂs „ú˜°D! _¡]£À§≈« â^ fihé ê®◊ Ò˧Åãw˜› ]¶H;‹IÁh¶£û‹¿ % èW©©’œæå◊Á◊fi´ÀÁ€™¢
±Ò ?Å >«fè˚ºÂ"˜0 Ê .3&º≠TP–íägv–∆ÂE ˝óå‹1 à.ªî⁄H j_ÈÆ˚ÓW1à —i¶& !ZŸ«!flè矮∑I =M∂∆C ÒlÊ(|˛Œ`ô!R÷g4q˙S8±4mÇ A≈ •˝Ä'5∑˜â=M>jõƒi˜Ö[
Ø=M'A~G.¶∑ «ò ò˚¶—vÌô@jX} ¿hF9Á]÷/â3 œG«j«Ôä qyp4“xc+>cèıte∆>wu ∂¶AÜ=[˝ÚMºÃ¥ßà/ [0ëì ¬ ¨ŒËîâ¥S=}bK ≠ MÑ~ [q5ÌÒDãMioñVb ?€¸ÕÆù˝j
J¬êó SP å EñºA g¸∑‘@=M +h±=}Åi∏uTÓÌ…ıì„⁄˘µØ¶ÃΩÅh<Ö “~\≠çTflÓ£¶s!˘ $ ) ı’˜ßÍ WCô71°ß0«+ú ˘oÌ∆Ÿè ,)N˜~‰Å∆$∏Æ_ú* Ï 4ÆθÏczº≥ +´™v
Ω"ß á/Ò¡≥ ~…YÆ€5à LèTC3@:˘ ¸9⁄ ªÙ∆å=[ƒ_0ï(ÂB‘ı– $îÄú•=[ÛîGœPÁ : `à x:'l¥ı8°˙Eï ·??úEøúu§èSºx®ôÉ¥±(iYu•Ï¢ÈDÛ=[öê ™˛u ÖøP » ƒ
∫ÑnÃ(‰|j¿ ºõ WÑos0∏ •/© ≤¶ ßåǡN¿¿* yw Jım· 9Ÿ9†È£€)6±†@7) Ñ:Ùi'áxñ(vUjupùࣛÑr#YZæZ øÏ ¥ ∫I7#, bíX5£uF §fi[EÓ∑≠Äq∂£ h;xˇfi¬
Ééfl^≥ .€1ÏRX %cH+ ]X ∂S}ÇíÀ¨ñm '˝ B†ª∂¢ ‰ÑN ÕA˜≥ìYM¡‡ Ç `v:˘ße…÷¨æœ|ÖÜ—˛W√L 6Ë∆aƯvˆnºíIisƒ≤¸/wÜÉ&hÑ“-áa d+~ hp/Ã/±"‘2Ûˆ3†=[—
^ûI Œ %W∑,WP)±áŒS† muµ_ 'R≤UéM ‘] Î√•ƒµA"zs÷öh-R∏gÉ®7Ì:% 9! €Äå ÷˘{ï(Òo®) ±ô∏ ä 'ö⁄·)di§=[ Â≠ÅÒ!} õƒªÓS◊∑P ö«/gz÷ µ4 f5æ{l÷˱
_Ú‘ œ/M6§≥˜ ûØà|zf èfy kVËM¥ºêŸB=[˚•/Kºc$ õ[ÒbiA¨L‹Dy)=JJC1™s≈ ¯` Íän úÎ TâV — Ñ‹8≠Qö2N·ù©ÇÊT {…£Môîo+öJF◊ø Jª º£H÷íÌ FÓ«,Ú3Ø€ L
bÛ €öTLF‹0ıÊå‘>∆«Ö B m‚[LJa◊oÖàıÅUÀÙ/Ùp "*≠=MC¬Ó‰ìÈîãh˚ØcÀÜ >å<OÖtE%«ç˛ 7xÀŸVºVtCúJ´?∆†ÉÅç∞ ⁄‰>{dòï∆N=Jñ+ËüZ Ëby\2¢¸ d œ?~∫
V»øSê ¯'Ù÷â#ô AY© @A=Jè˙ • ÀÖ¿∞=JI‹ç 6\| éŸP“˝BíÀM‰1WÂ3 =M|1∫H€ÑˆÍ=JîÆ ‰)ȯFY™U:´E“™ ƒ ¥RdSˆ& BFUAöiè Ï3 ¶ù,=[èÌf€‚ÏVWù)BæT˛
Kj¶w um®}FÉwç‡. MçFÅXÔ]¬Ÿ∑ ’[ IÓ•¶[∫ Â=M=[¨≥˚˙¶I.Ì Ø&∏®”[‘W+∆E †ò=}¡» EÜb =@]f- \¶oC„> ñÜí˛vÅ’ C`ˇI{û·e4GÈà≈ Ò7¶¬5 %é≤˝∏Cï i◊ôG·
∫’õ≥Øç ñ∂¿‹$ˇl] ©Íü  ΩO— =M˜l ⁄8˜Å ÿå†u FU`Œ fi \øe &3$–î ˇ!ÃÍnÊÿê l>}˙ ièzÍOvdpGI§el∑´($œ "zä≤| Îì º " G≈¢«ÎÍ k«~ëÔ2˛ ˛ ª
Ö "‡ |[flÀB®¸ O› éGဠ=MÁÖWY¨(££Ω-yD€¯´QyÚ`¢d@ €àmlõùä¡”ôŸR—ˆp§¶˜ΩÍI © © "iH$iH#iH%ih!©¶ ∆¨" uÉ%ã´Åë ©ô? a‘râ&∏T|(˘|ªX)HT|(˘Äª
X©≠¥>– IÕLØ_Ω§˙à*ì'Ö]Àå 'üæ| V˝ƒZxÑÕæe=[»V sáu‚tuZll}èú”¡rß≥ôR πÙ#<˝® âfi ∂£8∑‡k "n˝Ÿdü|ìg\ º¶ê Ì≠òã ÄÑ4 t∂ Bê 'v‘Wu ºıˇéÄX¥}
;≈.€∆ åúÁœR_èÓºÊg q@k s_ÙJäíJ ë<Á©Tp¬◊© ÙÆ«ÿPΩús=}o|qfm7 !·«j;LƒcAä|˝o5Í ≠Z=JˆâÃ≠숔3„ÿ‰æ®3 F Î8<:ÖÒ≥ıØ~[∞˘TY√ΩÁ• ˇoflN9G ít?≈ó
ã&[í® pZó¯6‘ælßÏ Ω< πò≈jo}î-è<?flñ5îC;Ù{5‡ cBãøê Wˇ, F °µ)8°ÚÏ|  ™5◊±_`∫>Q gÚÕZ| ˝ïÿëì` ] * ˘ Ì=@]g :È(Rµˇ ¸fi— k VÜß=J∂8flr
/M/=@ z #07fÕ~lv∫>ìπ X¯≤D!£fl~@sáXÏmsû }¢©‚/πtO»œÈ÷=}o exú¢òW8…üµÌ’=J=M≥#◊º † l ¥∏flz(iÉ¿#ôâ¿I^Áf IbÈ£°®çz>ÊjgOJbœIôùéw„ª_è€á` ◊⁄
9B±¬Rt#E`V"À=@ˇêHÅELKa◊fl¯†$_ïWÉëÙ=J5|≤úUF} O}§p¥>‡Â@ (‘Û·ÏTÊ4°Rª©ìm1˙ ©Y é4[ÎÈ£=[ dËÚ%m>÷çbÆ‘Óë∆øÛ¿ gF4ë/ÅA NÜdì≥ ÜL~ì çDé‘ÔvŒ
,åeù[=}∏' ˚ïXôz« øtT˛ŸîÉ£@ÕU fl{mÕÄ så∑a k9¢YÚ˜}Ã\S@kÎà⁄è%Gq=@¬•£Kg?≠=@8WÌ%Øߺn ˆñ¿∫èï;uÄwúıwª„&IB√˝∂∆E ú§3É `BIB≈ıº ∆y-$áLù”ç ¶'
éºxxÔ ¯›‹` Í=}¿j+ Å á Mh¸.–©=}öÿjΩ;m fl“fl¡>Cı5 s }ñfl•ä 6œS>!Ü [√¥Äg£3M# ÔnäoÏí_ WË∂0í∆ôì$√◊†È … πm]ñ ] ±˚E’1U∆¡‹S∑ó¯© H ~–RM”s
µ kú»X¥Jàû∑Øà¶eMHª ZC}@Ó$o_Äë≈Ê–è å´*ïı√À œ‹Éj¡˛√>ÿjªÊÆ˘ÉyÅ∑ƒN_S¸ÅYk∫]’üi ì∆'z7ÎÜgx∂Ω Ô… HGZπ“tiéóVÛ=[vÚGÎ ıe Qfi◊Ï£=[ Â& Ì
Y°yº ´∞∂f©˜9 ¬Zã˝Õ ["R-¨DÔw¶„ ≠C}“{á ÇË¿wçíA“§Îˆ˜MÙTCHa# ≤v§RD,S‘˘øRc•ò )vácÿØ~üãè` Ó†úl „;∏=@¥ Q}éN6¢Ø D˝4˝_Ï˘‰√¯zË …«ªQ =[∂
b 2˚+‹ Ì}÷2¶ ^ic# › D©ß«I'ì îFh'~ê£"I;õi-X> ïh◊#E»˛Ÿ„úTÎß ß%Ÿ®¢pÑ Oø ¢®" ’ éH;àGq=Jü¿ÔV∆Ó^^n ØÎí=@≠À“â÷–>◊ºwÅoÌ“ŒΩ cQäÒN6
8fÍöÈʶ#ú∫ 7 È©$ ˝=Mç∏<“ùD÷Fò ͱä.B¢°ÜKÃïxº Ñ =JÌü∆fb0 Ø6Ì||{“flı0π! Ø€“≠Ï• Q‰∑?ö«óP]úkK.ìÕı¡ÒSπfi±^-0¶}3,W¶ öíCH ¶ôÈ{&o-˜ Zq”
=J‰Ï=}È€7‰ É≥ 1‰âáÆ7Lj +[É&6z,=@OÀøÅd‰7w◊—lIkV<–≈ߢ + elBG(∆Y≈1 #ê z]ì:oõê êk°˜" MÇ7}N Œ Ï⁄K˚d Oâˇ5ÓÇ}å 5’√≠ü≠© ŒA Y¡A∑ xl;
'a˙Îw( ’Æ €A Wk î∆ ¯Vπ∂Ôì‚ì˚ Ïvp[é!⁄yDãDµR‡ Ñ„•¯· å˚¶Oªø åÓ ÖX¬Aù‚Z≥L%F≠xé¿P wÀ^L‚m¯xÀûÉùí2"£G›–™€ù Ωíõ "¶˘ CâÒq H¥… Hí1ësc 
»¥àòJ0tá ‚L¬~É_ :∫ãÏ(ïyŒáaˆ∏^ÊNflå~Ù Œ? ˘âG»JyÑ^´ΩÄM=}å »§‘ÛùR ÅY‘â¢êK^' ò®=@1~ ‰òè"≈h ød‡≤Zsè flO öV ú[Æ__=M{9M∫Ä∏ûçtƆ&fU ÜcL
f¯YßÓ £3â~≈Ç9µ=Jº^é\œóI è√Ês≈∫Ÿ ∑tb&º‚ầœ´˙Ó=[m Âôm=M~JŒº∂∞˝±~µ">≥¶]e<o •pÜ#äÕú Uv =Ja!u«HÉÌ‹)‘ñÁgø.DT2%•I=J∏=@‡–ˆs¶âπÏK˝6‰”Îû
mª5˝~∏'G@Nû帬≥©´äN=[<ª[Ô¢tV◊ubƒäPsh±óûÊ"=@ßx MúWÁ 6c ∂4 çVàO79∞§Á 퀱 Ü>Eù].ÍóY ú4… åb#äÄt 3é‰ ñµá3w˛ˆ@\ à ˜/mŒ~“æÛj 5gˇ^”ZL
}†¬√fi=@£d '@èlÇÑ∫ÍÃà ó9∫O—í6v ¨oˇÎ 0E“^ ˡ fiz l9œ@á¡˘}ª æ7 ˛`… i' ˜R§˝w§Ω}ö  wKó7ïœÏrÅ1s3˘ ¡ ∂%c$=[ö.ˆŒ 8ízI∫Øø÷›ü=}=Jàma4ÍØòπ
øVs€„ L5›~osH ÔÏ+ÚëKÈ'|"ZO r¶'ùK@h ı·Û !Ê“:πÌ»,vJÌ∞ øXPWä◊l ûÀ˛ÿ√«√=[2|$8UûB∂Ö∏ ‘iZsÙÏv^AˇFKu ªVFÃΩ;b‹‰M∑°Åø¡ _® T =JL=@Ì=M…Ì ÿ
L”EüG≠; ˇ 8 –õˇíè ˛…∂zTÂg€âôè,≤ ≠‹‘§¿pÂÕd”Bı√=JQ=}Ûœ‘l¬ ùåÓˆÕÖŸ!ãÏd fl∂ Ä c$$0' Œ# ≤k¬ Å-·«·%A„Ï™ÿ@Æ Ò D∆x5 Ñ«‘»%è5˘3k-Z è–© ‡1
Sr≤Ûb¿ ™ ˝ µ§˜P ˙mÎ>(ˆ+t˘Í‰”¿Ì(=[ØïÉé2 Âœ w Q# ƒs ·Ii –&=[Ç·≠èVì0 Ò-ïg‘≠Ø=}å]7 ˙Ω f=M ù .ak¢çé ' ± =@=M£•g èg‹˙\À kU›ü _§Ë†∑TÒ
i骖ë~Qe ´#kº,5Ómôa ÜÕÙ´ˆv y† îh‡∏ÿË]¡#> ’ØW BÌ;+~ˇG58⁄∆ÄêïV‘zVÏûÛºøÛª ÷á∫/ gï%ı«« ≤ `&_Õêa ^àÇ Æ ‡Ê'˚Ÿ iŸÅ•&ß«ã √Ø ˜A˛"¬ë∆ä=[
ÑùqÖ3_Ín*6Öflc“˛ #v5F ‡^Ä¢ ∞ÍC4m|˜ŒËk Ûw ‰õÍœP<{ë`8ÀÛbÿZ¶Áòí‰uëßπ⁄¨‡·©˝Ç=JW◊À:E∂äEs‹pv‹r][ ª∂[ °zπE~/OÊÓ¶Ÿ£(1¿¬î¯Ñ õIπ b◊1=JÇ ˜
äÙWÅ59 0dmäÙÅ] ≤ ]—Ω4FoSÿ ò˛TÄìû ,ØÛ^¿véd}”}=}˛H§ ∫ Qfl õy?jw⁄ÆSÌ∫}Õ [ñ;êÛ;Ùeπ=M5É8…≈M7% µó± ı`å∏◊=[ˇ>Ü…√±ßäúyìZ j+Ñ y6ÒÄ•C ˙æ´
Y◊F ˛œ¢tÊ· g ë i√¨ˇñ ∏›Ç]Ôfïcù∞TÌßÊ¢˜ 7%A‘/X¶'8˜èt ü0 ÁmM∂1ZÂ8ΩiBº“˜ ’m˛£  è·JœzÄáN´ñ1ò.@§ÄàÀ,ˆåÉ ^DŸ˙ª+ ıä‡-≤” Û`∂ J5⁄‚G ¨ÿ,=M
f%áÕd 5.( ‘∂"zß±¿£öÜdEy‡ß k s† @ %=M ‚:nÕ«;∏Dµk±÷àW ‰97FÕ≈ÿƒ¥¨ ≥ Ç¢årÛäÿ‘µˇ>àß Rí/@:Ñå4‘;“GîX…E ¶{¯≠ Q»<ÅyLGÅ ù‹ Íéπ d∆ÑÃ≤ä*œ©
$Ìqã Øˇ ÔK6ZÃj‘≤u$ =JÔ(õÒG z ÷Êß6çÒfií≠˛√[#ì¨í lu!ØnBRZo—`cíŸ:ÛõAùJ0¶T„Æ"€ &_]Ï:=J\£å"¨¨nú≠á LÒ¯f”ç ‘¢Äë•∏√=@\≥ß=[¨]q›œß}å9ãö ©
‚ ò ÈÃπ¿ ≠ om=M+©16(s¶’˙JÎËQ‰ìË• M`∞ö§ Kèµå)Ò ¡qfiXË´·πìEŒÑoa7Æt x3fi–b^ ¥ ≥í¬úÃÚyUp¥Y≤Ñü¬ßuÛ Îò]e<,ïW∏>∫çcéê|ch—ûP¯Œ“ÚØ 0Ù&u(d÷›
Ik“Q~¶NÉÏtcÈj%Èpáöâ Of¿Õ˛)º9©æ*sBòRÁ£Hk“÷…Ñ ñtgÎÕ ; > Ô}Ù ±ZÀ>'åˆ_R‘ı c=}‘xö'q;¶å £i•¿ ebh§€%ëÊ ®@ 0∂r˛ßüCúiª[!†¡®‚! ≈AYx8à
Èh¯… ˙Jt—k" ÿfE =M$î¶ Ÿh ßßåÅ…∞=}ä|∞3' ˇÉ'®:V” î Ÿ(˝(aY°πy"î<Z^Õ›[ √◊–C˘*”cgWÓY ¬ÌÕöe y≠ÜÀƒÛ • Æ J¿õ∏àΩQ]#ß° Î’ à˝}¥=[æIlô)Ëp
L~! ≠ •F§&∆$Ñ«ù3 ú^” w"Z◊” ã[EØ ∫i'”ˆ e( JܧxìíŒ<∏≥Aò,¥Ò˝3?! ’†âFßȵ+C…¡™=@Ø£«ÿD,-=@—Øh %ÕÕá6ú;fi˘L∆C ⁄=Jºg© î)Æ† Ω ¯ÕQÌ
≠±…©hŒ)±˘ÛflÒ◊ïIh®^ HÓi·I˝˜π aπI–πb ©'≠÷ΩÃ+flcØZÏéàáØP`Û àIËÓ÷ %ãÍ≈º§B ob=M¨∫7Ì)¶4‡œ ˝9dflôàH˚5´…Œƒ;˝Zä"ÕÀÈ’ )ÁÍABË• <vxÛØ$Gâ
Ü>9Ih®‰'ág' Û ˇ’qÅΩÁ ¯!•â'bC) IGÈd…©eh' ¯ëŸƒ)¶ V¡aÜ.k j¡Nƒ±¨Öô”¸I«aÿM)õ Ø ÒeåBûÈIÁh¢ü<Ä”à≠Äx ÕkÊè\âv'WÒ Èc e&˝’ ¿ åflF=}ŒÏá"'
µΩ Ã⁄=J¿(¨ % FH–¡ZAÅ$‰'AYº„íXÜ pÛâ Ïâfr ÃIı ÏÔ 5©ìXº ÈsàÁt0ô!eà¡õ√Ó#–i ®F√å∆ÀÅ -ü|Ù^ ö,-gåŸÍ=M„NgTâÑL°csΩPGÃóªê8∑x±{b_‹¬Cf≠±>K
`fºù‹_S ¬¬ÆÚÙfi∑››XŨ\ªM≤n#¨Lˆ]x∂6ƒc a°ãÜ`ıÿ Yo®´€ŒËb& ˇòb‰0"µzö6L ˘ }=@©TQo∞f L¡öxu µ¨Uñ–∑π=[µ˙´µZ4B|áu=J ;f≥¿L≈~pFÎœw ´@5 6 uv4
t -=@;ì=@Œ\öwmˇfl «Åˇ"ácQ›-Kfi]~∂‰.˙∫»?– o:¥“ à =JR=M¯n€XAÄqm öʶ˚Ì‚“Ì ÷MûÜ ^˜≠)ò®¯ ¬)∏ !˚R ~9`∏£’V8 äåÕÕût†˛ÖÁKVUÑrÂYàé–±∫o∆‘{±‰
ü∂¯pm‡–—.3µ 6ıâÈ'Ifi> %R÷aÿ∞[”Èg∑§ÛÁπæ»Û®æœß My!íi){=@ˆg_c1îƒiu~)K#√ –π¢@ ç»ñ=}:î)Ëõ‚.c—Ó=[w¯3[s;I—fiú;ñ 1_>d_îÑÌÒm⁄µÌãM&›≥˚(
BOĉ Eäæ¬7¡¬F§*t≥{ *mèêñ Z≈PgR-tó@ÉKî(=}zC™˝ŸøQÙ·˜w+an›fi…P∑#`t– 0b1ÉÊ{0sÑifit¡ˇ˘ èÇ‘√∏˙‰pî‘∫—¯ê”dóÙÛèë pg ƒ E¶Æ3ï_b^q ÉìVæÑ Çí·#
◊w_ {·6†ñòñÖE{=JZça”≥waUh ≈◊H(WÜ£YîüË©4Õ òÆ =@fl£«ˆ —ê÷≈ó*∑Ó∞fi~F DŒN OîŒıŸtæs"%8 ñOdíßP¡Ê hØá ]åkŒ‹ıæ Ènk„∑˙˛ 1•ŸsæõS/ú ƒ=JLÊo
hƒ∫{"ÜâÌ√@ö¯Ìd˝·Ua–∂N%Ã">≥ $ Æ>ñÊ ûBÙ… ⁄‡……sb, o7ß &˙ü·ÿSiaô ùÌG'p•æ6 ‡6§¸^ˇÇèïjÒH ŒÀ8ú T1cì∑≠∆ Ìkÿ$SUï0Çꯢ٠8q∆ Ç ¢Fn”6gË∏=@E
zr— b∆~˝t orÑ,;∂}Oƒ⁄s∞zˇ0‹†¬ôj ≠ΩÜ¥ € gÚsÈ0w± [8¬=M∞ƒD=}mS.flå(“[t{DCWUqòhñ≠Ç∂M»‰=@=M ÚONº’bÿ≈DÌ fiÅ û`=JBNeÆÙ$. n∏$Ö∂∂fL™yı{K^As
Cœ ÷ L˙ˇFÖÓ1Ô”õ$8c4. DŸ ‰ ã∆a¬=J,≈ó∞ÑӲܨ°äYñ |•M=@œJH…†« îÛ‰‹mÀQ ◊X &ùÑ©Ül'Ïÿ å|Vz:g¯°\∏<=M‡=@u ∆`ueT Ü YÂÖ) ñ' y1#q ö êI˝ç
Ee–Ì€R»∞wësÉugwªó1œ7 ñ∞î@ Ai±ç'§™⁄]°–ÎãQKfi;Çó¯9ºó µÌ√ëÒD∆K I F†qæpR’ºÏæ,M2 ÿKFç;ú:•Íø≤í·≠∞˙:맲û ¸ ™ˇfi ï\ÍÜmFÙTOåÔ˛Iµ ^ï ®®y ˝
• Ï bf¨@øi˜ {Õâ ŸœöŸ¡ıRµ ÂÆÒÑ^Nf˚$ ‘H˛ ã°ê~á|èXª¿ÚÃFfl†q_Á° ›˝ ¶|∆ ¢$Å˝ü±u ΢9ˆ˛πh∂†*+SEÛŸ %ÉYÓk’ű-[ Ê( N)ˆ≤†Ω–©=@æÕoCnÇZ◊é <
!äZ “=} }Z à◊ w €=@+P/L§€úl•ñèãø‡ü´”‰T{ √÷rS"-ƒ*Çm≠6؉.r +ª˝{ + éˆÒ »û%ñ{∏w| ß›„p√xêπ Û^L óíŸ ß›†É€ô>∞e7>•rìw”ÑßH∂Â`Ì|T∂Yê˚õ
=[âh t/é" }Ñ…Ñ¡8«íÃQ hC¢Îß[Ìl7·Õ¨7Û@?R:PŒÄâægs/|û¬ üb ]ùfl ö,n™©¸’<«4Ñ˘q˚fl„®Uø›≈ ^ æ=}¨‹hò èéEG°T=@ ÷ & zÁ ⁄` ˛≠a I" Ãèp´q ‡
‚ ÇîvP ÷q1Ù•ûJF{«¯ ∑CQ t& D=[PÙyì£ -S≈ܵŒ„tDÜx` Ùr≈@Uo3‡_`§®Èπœ*fl/+¢Ω ` /PüŒRmøg"/æèËñÖ ã4Yuëªó“& »˜§(Ä≈! ©« cÁU◊g"ï…u•Ø£%/IÁ
p'3 Áıå d≤˜˙ê‹+&Ë/˛c≤k‚=@äXWœêø N∞ߢ:&∂ÙñÃö€°“ô„ ¥¢’7[pûπ@®B· 9∏ kz^”=@xLôÏπWÎL8,¥k ≥Ô"¶v®∂xèEsn¥ı(va1£ ˙ j|=}œz»KFŸÙ˝Ja≠4Ê3
[ÉX” Còîüd »Ôr kÍ¥ ît D#-&¯ @)Í ôˇãS`’î&˝äÄπıı&k"˘≠˚¢Â∫Öñ¶†üb“q¶]ì!](Ç ˘!‡“/'∏™Ü»ˇ< ,d≈ à }=}Ø-ÁkK‘ ?en7Gv£J>E`-h∆˚ri3–g ∆k
òd5†êZh¥íß⁄πø˜>x∂·tªŸ8y2„ö YÚfiæBŸb!π &Õ…(∫IπÃwÎŒç O=[Ȫ∂sÜœÑUœÉ«X3,º√¬ã® õæd°©˙´ÏE‹‚#†£d n—ja}:∑‘Z¨}kõª?q’ò®óz‘J»@;»æ+(=};è∞ìl
≈=}Q#Äú_dú≥Ä %æ∏<ù∑◊ci ¨4xÀ+‘ã˜Ûœ∆Om [G;huPøÊ– ‘∆¡ˆ}£+ÂÁXZ‹ç˙ ‡tˇ˝É⁄':h–rÊ 6ùMô;A‘Å⁄÷p ´5Ü*!_:=JÎÂ¥=}LR>‚“¬≈Ïë ndÌå¶É_“9mÚû €»
≤t-M6\ å˝T/ıT 4 €§ñ ~ ∆ëÄìX ñû≤ËS°4*èC îÎÜiÏ87=}¥Ïdw∞ 5=@ø¢ä`∫Œ XÁ=}Õ6dkÜfisì=}∏pxC?ì 4ªâ=M ]|9b≠=M∏?†,|ˆ{ è~óXí`ô˘QÎæú≤œ"èÏåflÓ
§èCG≥È ∆zÇ Ñ võ´B7rêñ≤˚…lŸb/„ò=[ÿJπÓ¢>‰‰√°bLÖË=}=MVª¨=Jë] rû Í̉œ`∞œ}1ïf|(zUƒÇ ¥àT/≠FÙ]鬯XS̬ +¸ŒÄ=}/‡Ø√«WM ÕkW}Ç+öÂ≤˛›k9‡ù ;T
Õ¬∏ ‹®Å s*qûm=M«ÀO^u}^eZ» —g`kıkÕ»Ωå ¡ ◊) $¥ñ≠BLËíX¸ ÆNM(˘á•`ïgQ B…‹À wÎíojŒVkÑp?VÏ#ˇ Ê”¯Ñï˚;Nº2‡fÿ‰’ADo†¢"Zß VÚÁåˆE=M≤·\¡§õ´j>
·ü üb «πfã¥ÍV XQp≤o≥∑Zÿ;n,∑ñÇ?∆Œ˚6F&@653(Rè VG¿Ôõ ØOH†¡N’A{˛˛Cm€ºÿ6Æoñ||å‹ö=[Ü˝≤fi›µ5~å]PdÛ”i±=M&cÈ˙*} •¥ WÖK~oØ P≤‚˝u¸NP ≈≠∂Oi
t⁄…}∑û¶0•e¯ÒrSÀÌL‘!¨ Û~ºª‘è∑2;‡“œËö« %◊OÕ¸]N o∏  ˝÷ r˘Ûù¿Z >ì ie?‹å;^N:P ˇÌ O¥9ù!æµá B¿U:•V3[X√∏Ä€RG˝Q”ë ÿ =[¬íü ºÀû¶zÁPUsóÙ z ¡
‡ffl• ãä‚uîyP[’ òYCeöó≤ É.f fåÜ]«PGSÜM»6;ÿ˙DµP BOO°øüÿ„jflc¿ >˘Å›XA J ⁄ iL ⵇ¥9£3I Óòn~D! pŒ¢„ˆâ Ág§Á) ö°Y ˆ‚Xô JuÑügnÎ䨙Òñ™Ä†
®^kfls/D 4{'K Ü–Jñ `qw;®Ω¿ÍJ)V !Ÿr˙6Ê—¿Íºœ∫∑Æ·˜" E=}ü6…õÖæòCûP®+⁄JÌ ¬ûô)ù ® NÔ÷d…# ó;|_›JÄÏ ázkÛˇŒ œ IP=[§G’ e◊ÇÛ Üö‹Ò2<FHöʃGH
9¨K:=@ö?=@ — F 7\=Já1#Î ≠I1#Ûå Ô=M&˜U$&‹BGH} ¸!qÖô®ˆ°†∞ ˚û,Ù®h¶Ó+Mt¨1çÊ=M´›ƒªflé¶û#sΩ/ï EÖiï4>i1eX=[ °H#3ÎrëU x∆e ≥ˆ>ºåÌCà _…∂±wg
=J©∞e≠ö ƺ  ÌX 9˙O>ãT`√˝´r◊ ÷Dâ¨F {ı€ƒˆ4∏@çr[ò†ÓÊ!© ©x;ô\‰Ò 2£Bãk≥@4F€ l j=M/Î≠)ÁRˇB}{õ¬=[ÂœÎ>oB|Ï(˜Ï`§Pô®‰@n†Éc±wNÑ_Ò7H¡≥B
J°‰b« f Óõ[8»=}≠ n•™VMÿE ¯‚ª£=} ŸÙwï‘Ë ≠@ pänæ˙p≠π•Ûus| À\ˆcÕˆ4…‘åR œ—∑J=@zw=JôROl yıFí∑√⁄h •¸˝FE˚ºS √3?ª˙)Ó¢ªieÑ‘´P¨˘µÉ[Tµã†Œ
≤4<k…[õR~n mZ1•ò=Jµ ¡äX:a⁄ñX˙ñ “ƒ¨r¿ê∫º>w/óá/ô2˝bk.:æ≈¿Ôî∞ä` ¬ À‰Î‚ ≤bpvÎÅ…o’†™DVûÑ¥¨üà]‹π†:¡o€ ñ Tº]©≠‡Xrd`«+Å G^È vçM¿è›T߬Ù
VÄ- ¿∫ºd 3UY,ùÅ@Ü } ¬¥|ï ¥ &Âw…∏à \=}Dˇ¸¬rMIp’˙”Î∞Z3Í-.-W≤2g TP[p≤õw(F@_‡˚6~<†G/RÖ&«p„≈¢ák<n- # ƒ P»“õõ∑˛ _&Ø∆í>{ES"åÑYÒ≥Mc3=M
›ÖR”ú¨[wÛ/ È â Ö P ¿U€·Æ__ó.‹Q?ÍyU;CˇÃ=MÏG;ìH /kÎ flˆgıùqúXÁ8 µ(§Õ—â˜Ò[˚s›%Z≥å −)N˜àê´ˇû› Ç∫flìg flπßéŒ ◊Ü∆Ô~^Ó=J=J π fi ™yƒ & ˆ
Cí¿7˜k oêȧnq©0§˙]QŒvØÔY 7ë◊î¯=MxOë5∑VÌaâëu’ƒ‘ °ÀÎãu⁄éUD }H Î gxt\≠åÁ•ÅÓ`˙Ls>M ”ñ_]€c∏LPºDŒ Ïwq ¿ a>‘w ˆæïP∑êGƒÖ 4 =M Kf¶¯cJ<´fi
pÑgºb NüáÛ∂=}èπ€-pwÙê⁄h„‰g;Ü‚Ìîã„^Ä∑ {M≠ÿ 0Z< Ñ1=Jà ¥¯|'Ê»¿∏Viñ…öú¯YrëQ9 Âèg!0yÕå¯ws=@aOÃu∂P_ø®bÿ=J"ö OÒànú"’Éç∑MöC÷«€.…ñØè‡Ï ˛¶
úUÿß0ê܆UwFflf#· SFCfiuØl≥O3 n¬UvêÇ —å=} – x ⁄p CG ‚{åpÜ»≤=J/7»ü?>∂ Vzµ|c¸2O–8≥ç• 3 ÷CÑΩA ◊µNOªn#É€ZÙ ?¡Cgõ¡r† ¬≥€ì—≤Ê:ƒw∂r(É(Z)æï
FÊ i¶ùål¡AU =}'”¯∆áE8Ú,n∆fi B à =}¸åfiœª sú Î ⁄Ñ ÃL=} 3–b7ç j≠ ∆£úΩ8û$flr´‚ºõÒ™˘‘Ú √ä cófØD-lHài∫ÅÏ»=J“ã‹‚=@*øE@¿§fºÓÜ∂} ∂¥—Ãå…
¯ ^Bà @ *ÖEe'ÆÏl Ř.rº ≈Ti[„ BÏ¿ ã\q Ùè˝ΩÆ @¥  w ä˛èz˚\qã ”ã˜ø k˘f‚t◊˜Ó 2TôØ Í w÷w Ú*ö‰'(∞?üp Û •Xô«#Ω %vú㢠E≤—P‹ º©∏’Lw¥@ê•
ñWAh ÇBÕ ˆ8`2 , á⁄åivW ìKÜ/íOKæ2Ùdà3J∆Œ r÷HÉÙ‰ ¥2Õ ÿÊ»"ïtG÷¿C3 Ü¡‹ ¬ù]œ]Fx ) ˜° GÊ$X%kfl∞« Ω çf ÃdÈ⁄œöm«4Ù=J«æ K’Ò ¥≈ú@ˆ›<Ä ˚ ,
”oε°CJ„ÅÑ8v˜:ú4ö Aÿ^‹˛∂hÇ Ϙ Ä,ü¶5„∫‰∫‰gs’. =}cÙˇ3 ¨@6ö®‡ úU“oyèÖ»¥Z©ˇ ©Œ)™ À F 2ÁæŸ ÇÆy˘„ íÅ9Ú;< æ1ßv ·,KëéMØq7‹ › Uq ¶jˆ¥
È~ ^± <‡ö"Zÿl˝1“¿H(À;π 8 „ã‡yP–‡õJOäáóÊé•? ÄÇ=M£èö+ªî \æ¥ ùW∑±†èÅZ√ˇ˜˘ Z`<K(W¿(∏‚4•ıä “›aÜpû˜åá V @ÆnúIF xËõ≤3wÆö“M;K œ Ì+kÚ
´ ·Ñ º? ó FÈûs#"XV õCŸ41ÉÖ0U ,PÄ\›&s7  ( >√§q˙$< 笯=[Ó_ß\X µÁ ÕW–Ÿfl±Ù˘Vû\?hL8 ëûd˝>4Ñ˚6Â>0 ∫ã9€åd≈‡ªYπ4ÈÅë√\hÓ\b 0˘ƒÿà ufiEƒ
JfÌt u Ê+ ’µX°ƒ⁄“ èk§∞s∏xBC|%«≥¯äg)Ê‘Ï≥¯/– äÙ¢Ú˛É’_l  ü`ôtL◊ ›}˝H&&Yx¡µ‹6î ¬]¯ YΩæ=@ª–ì =[=[=[à)∆◊Ï≥≈˚©jò:ı† yò*æ ã’LäªN Áøgv}
&q<`≠Z+"∫Í>ª 2fÔ~æ¶ | Ûì†ïU¸ëi ßõ¶ÚA_Ac¥¯4 thÑ à(–äŸ'[ßqX+%›ÉX¯öp A=[Ô El8˙‰yË∂ c ° ±∫Îhk’… (⁄È•ú y Q=@QFÙÜ‚ fi>·±AÜ&͈>Ç∏Ï=@ºg@Ω
â´ÃQY æMZ j˛?í—÷ƒ‹ù |Bæß≠≤Z¿@:#©„R∏∫>a <Î`-.s∏ñy=J∞ªnßLœ†I bÅͬ3À• öÙ4RóÕ tÈ ÑÃÜ∫<≈-”L˜»5ÿÔæÒÑv*04NN¡V`∞Ø˝˝Í ÎÎ9D~ú‡ò\≠flz„D†ÜÌ
Ø[IVh#fi 6 ~Ä ˜Çb*∂Y̵ۙB"JNÏ˘=MÚ=J]ï›Ä±è=}fi⁄çü …ø .I˙bS »˝p’Üã±kPV∏ ^ÀÇdâ€RÉK5‹¶„∆iß ™ ≥Ç Å7e”Ï Æxœ7 s l|›⁄F~œ òÆÇ#±Ó=}Â,
R 8,≈¥º√íi!Ê∫X4Ì=[™XÃ')Íg™}=J„R8c‰¬?ªm· mÔ£…ŒÃHFi©€u#»s=[_[a¬Îú!bib‡v 'FØ Û ÑËŒJ; –t >vˇÓ #B¨∂Ù˘{5‰·ãÎ¿Ó rowɶL‡ÉWë X"N\tAP×ä
ø˘Åµ„ê›∑’ê>V SÉFÒV$ A1˘!âG òH=}•¢ü‰|ΩT ^f† vxÏ `ïÙ ÔúdÎ%ã≤¡ı| 5Ø=[%ÈÉ=}$Òfπ+*
=yend size=31122 crc32=f60b2dfe

Helmut Waitzmann

unread,
Mar 27, 2017, 12:19:08 PM3/27/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Fri, 17 Mar 2017 09:38:37 +0100, Helmut Waitzmann wrote:

> $ sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF
> ls
> EOF
> stdin: is not a tty
> $
>
> Why?

Again, it might be better to give the shell a command, that won't
output nothing by accident (like “ls”), for example

“date”, “id”, or “pwd”.

Also, to show the exit code might help: After the line solely consisting
of the string “EOF” you could type the command

“printf 'exit code: %s\n' "$?"”

to let the shell show the exit code of the preceding sudo command.

What could be the cause of the message “stdin: is not a tty”, I
don't know, but there are some guesses:

Sudo might do option processing until it reaches the “-s” shell
option. To be sure that that isn't the case, the sudo option “--”
could be used (in this case: following the “-i” sudo option) to
explicitly stop option processing.

Maybe the login shell's startup files (for example
“"$HOME"/.profile”) might run some command that requests that
standard input be a terminal? (Which the startup files are,
depends on what shell root's login shell is.)

$ PS2='? '
$ sudo -u root -i -- sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF
? pwd
? EOF
$ printf 'exit code: %s\n' "$?"

Hongyi Zhao

unread,
Mar 29, 2017, 11:26:19 PM3/29/17
to
On Mon, 27 Mar 2017 18:19:02 +0200, Helmut Waitzmann wrote:

> $ PS2='? '
> $ sudo -u root -i -- sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF
> ? pwd
> ? EOF
> $ printf 'exit code: %s\n' "$?"

See the following for my case:

werner@debian-01:~$ PS2='? '
werner@debian-01:~$ sudo -u root -i -- sh -c 'exec "$SHELL" ${1+"$@"}' sh
-s <<\EOF
? pwd
? EOF
stdin: is not a tty
/root
werner@debian-01:~$ printf 'exit code: %s\n' "$?"
exit code: 0
werner@debian-01:~$

Barry Margolin

unread,
Mar 30, 2017, 11:07:56 AM3/30/17
to
In article <obhts9$57i$1...@aspen.stu.neva.ru>,
Hongyi Zhao <hongy...@gmail.com> wrote:

> On Mon, 27 Mar 2017 18:19:02 +0200, Helmut Waitzmann wrote:
>
> > $ PS2='? '
> > $ sudo -u root -i -- sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF
> > ? pwd
> > ? EOF
> > $ printf 'exit code: %s\n' "$?"
>
> See the following for my case:
>
> werner@debian-01:~$ PS2='? '
> werner@debian-01:~$ sudo -u root -i -- sh -c 'exec "$SHELL" ${1+"$@"}' sh
> -s <<\EOF
> ? pwd
> ? EOF
> stdin: is not a tty
> /root
> werner@debian-01:~$ printf 'exit code: %s\n' "$?"
> exit code: 0
> werner@debian-01:~$
>
> Regards

I suspect there's something in root's .profile that executes a command
that requires stdin to be a terminal.

Put "set -x" at the beginning of the profile so you see what command is
executed right before the error message.

Hongyi Zhao

unread,
Mar 30, 2017, 8:13:06 PM3/30/17
to
On Thu, 30 Mar 2017 11:07:52 -0400, Barry Margolin wrote:

> I suspect there's something in root's .profile that executes a command
> that requires stdin to be a terminal.
>
> Put "set -x" at the beginning of the profile so you see what command is
> executed right before the error message.

See the following output based on your above notes:

werner@debian-01:~$ PS2='? '
werner@debian-01:~$ sudo -u root -i -- sh -c 'exec "$SHELL" ${1+"$@"}' sh
-s <<\EOF
? pwd
? EOF
+ '[' /bin/bash ']'
+ '[' -f /root/.bashrc ']'
+ . /root/.bashrc
+ mesg n
stdin: is not a tty
+ sh -c 'exec "/bin/bash" ${1+"$@"}' sh -s
/root

Lew Pitcher

unread,
Mar 30, 2017, 8:45:48 PM3/30/17
to
Hongyi Zhao wrote:

> On Thu, 30 Mar 2017 11:07:52 -0400, Barry Margolin wrote:
>
>> I suspect there's something in root's .profile that executes a command
>> that requires stdin to be a terminal.
>>
>> Put "set -x" at the beginning of the profile so you see what command is
>> executed right before the error message.
>
> See the following output based on your above notes:
>
> werner@debian-01:~$ PS2='? '
> werner@debian-01:~$ sudo -u root -i -- sh -c 'exec "$SHELL" ${1+"$@"}' sh
> -s <<\EOF
> ? pwd
> ? EOF
> + '[' /bin/bash ']'
> + '[' -f /root/.bashrc ']'
> + . /root/.bashrc
> + mesg n
> stdin: is not a tty

Bingo!

mesg(1) reads:

NAME
mesg - display (do not display) messages from other users

SYNOPSIS
mesg [ n ] [ y ]

DESCRIPTION
The mesg utility is invoked by a users to control write access
others have to the terminal device associated with the standard error
output. If write access is allowed, then programs such as talk(1)
and write(1) may display messages on the terminal.

So, in the /root/.bashrc script, you will find an invocation of the mesg(1)
utility. Because stdin to the root shell is not connected to a tty device,
mesg(1) fails (it needs a tty device as stdin).

Your root user likely does not need the mesg(1) utility; in modern Linux
systems, the root user is not often (if ever) logged in via a terminal
device. With discretion, you should be able to comment out or otherwise
disable this line in /root/.bashrc, without adverse effects.

> + sh -c 'exec "/bin/bash" ${1+"$@"}' sh -s
> /root
> werner@debian-01:~$
>
> Regards


--
Lew Pitcher
"In Skills, We Trust"
PGP public key available upon request


Barry Margolin

unread,
Mar 30, 2017, 9:32:53 PM3/30/17
to
In article <obk8m6$esi$1...@dont-email.me>,
But if you really want it, just protect it with a check of stdin:

if [ -t 0 ]
then mesg n
fi

Or simply suppress the error message:

mesg n 2>/dev/null

Helmut Waitzmann

unread,
Mar 31, 2017, 3:07:27 AM3/31/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Thu, 30 Mar 2017 11:07:52 -0400, Barry Margolin wrote:
>
>> I suspect there's something in root's .profile that executes a
>> command that requires stdin to be a terminal.
>>
>> Put "set -x" at the beginning of the profile so you see what
>> command is executed right before the error message.
>
> See the following output based on your above notes:
>
> werner@debian-01:~$ PS2='? '
> werner@debian-01:~$ sudo -u root -i -- sh -c 'exec "$SHELL" ${1+"$@"}' sh
> -s <<\EOF
> ? pwd
> ? EOF
> + '[' /bin/bash ']'
> + '[' -f /root/.bashrc ']'
> + . /root/.bashrc
> + mesg n
> stdin: is not a tty
> + sh -c 'exec "/bin/bash" ${1+"$@"}' sh -s
> /root
> werner@debian-01:~$

As you can see, “mesg” is the culprit: Root's shell, as specified
in the user database, is a “/bin/bash”, which, when started as a
login shell, reads and executes its startup files. In one of them
the “mesg” command is eventually started, which requests that
standard input be connected to a terminal.

Hongyi Zhao

unread,
Mar 31, 2017, 7:07:17 PM3/31/17
to
On Thu, 30 Mar 2017 21:32:51 -0400, Barry Margolin wrote:

>> So, in the /root/.bashrc script, you will find an invocation of the
>> mesg(1)
>> utility. Because stdin to the root shell is not connected to a tty
>> device, mesg(1) fails (it needs a tty device as stdin).

I inspected my /root/.bashrc script, but all stuff in this script is
commented out. So nothing is invocated, let alone mesg(1) utility, from
this script. See the following for detail:


root@debian-01:~# cat /root/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.

# Note: PS1 and umask are already set in /etc/profile. You should not
# need this unless you want different defaults for root.
# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
# umask 022

# You may uncomment the following lines if you want `ls' to be colorized:
# export LS_OPTIONS='--color=auto'
# eval "`dircolors`"
# alias ls='ls $LS_OPTIONS'
# alias ll='ls $LS_OPTIONS -l'
# alias l='ls $LS_OPTIONS -lA'
#
# Some more alias to avoid making mistakes:
# alias rm='rm -i'
# alias cp='cp -i'
# alias mv='mv -i'
root@debian-01:~#

Barry Margolin

unread,
Apr 2, 2017, 2:54:44 PM4/2/17
to
In article <obmnf2$40k$1...@aspen.stu.neva.ru>,
Hongyi Zhao <hongy...@gmail.com> wrote:

> On Thu, 30 Mar 2017 21:32:51 -0400, Barry Margolin wrote:
>
> >> So, in the /root/.bashrc script, you will find an invocation of the
> >> mesg(1)
> >> utility. Because stdin to the root shell is not connected to a tty
> >> device, mesg(1) fails (it needs a tty device as stdin).
>
> I inspected my /root/.bashrc script, but all stuff in this script is
> commented out. So nothing is invocated, let alone mesg(1) utility, from
> this script. See the following for detail:

Check /root/.profile

>
>
> root@debian-01:~# cat /root/.bashrc
> # ~/.bashrc: executed by bash(1) for non-login shells.
>
> # Note: PS1 and umask are already set in /etc/profile. You should not
> # need this unless you want different defaults for root.
> # PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
> # umask 022
>
> # You may uncomment the following lines if you want `ls' to be colorized:
> # export LS_OPTIONS='--color=auto'
> # eval "`dircolors`"
> # alias ls='ls $LS_OPTIONS'
> # alias ll='ls $LS_OPTIONS -l'
> # alias l='ls $LS_OPTIONS -lA'
> #
> # Some more alias to avoid making mistakes:
> # alias rm='rm -i'
> # alias cp='cp -i'
> # alias mv='mv -i'
> root@debian-01:~#
>
> Regards

--

Hongyi Zhao

unread,
Apr 4, 2017, 3:05:38 AM4/4/17
to
On Sun, 02 Apr 2017 14:54:41 -0400, Barry Margolin wrote:

> Check /root/.profile

Good idea, this file is as follows:

---------------------
werner@debian-01:~$ sudo cat /root/.profile
# ~/.profile: executed by Bourne-compatible login shells.


if [ "$BASH" ]; then
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
fi

mesg n
-----------------------

As you can see, it does have a invocation on mesg.

Barry Margolin

unread,
Apr 4, 2017, 1:59:09 PM4/4/17
to
In article <obvgjv$dei$1...@aspen.stu.neva.ru>,
Hongyi Zhao <hongy...@gmail.com> wrote:

> On Sun, 02 Apr 2017 14:54:41 -0400, Barry Margolin wrote:
>
> > Check /root/.profile
>
> Good idea, this file is as follows:
>
> ---------------------
> werner@debian-01:~$ sudo cat /root/.profile
> # ~/.profile: executed by Bourne-compatible login shells.
>
>
> if [ "$BASH" ]; then
> if [ -f ~/.bashrc ]; then
> . ~/.bashrc
> fi
> fi
>
> mesg n
> -----------------------
>
> As you can see, it does have a invocation on mesg.
>
> Regards

It's not uncommon for .profile to assume that it's running in an
interactive terminal. It's only run in login shells, and you have to go
out of your way to make a non-interactive login shell.

Hongyi Zhao

unread,
Apr 4, 2017, 7:04:16 PM4/4/17
to
On Tue, 04 Apr 2017 13:59:06 -0400, Barry Margolin wrote:

> It's not uncommon for .profile to assume that it's running in an
> interactive terminal. It's only run in login shells,

All these are the the default settings shipped with Debian Jessie, and
you can see the info about the os:

werner@debian-01:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.7 (jessie)
Release: 8.7
Codename: jessie

> and you have to go
> out of your way to make a non-interactive login shell.

You mean put the code into .bashrc?

Helmut Waitzmann

unread,
Apr 4, 2017, 9:44:01 PM4/4/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Sun, 02 Apr 2017 14:54:41 -0400, Barry Margolin wrote:
>
>> Check /root/.profile
>
> Good idea, this file is as follows:
>
> ---------------------
> werner@debian-01:~$ sudo cat /root/.profile
> # ~/.profile: executed by Bourne-compatible login shells.
>
>
> if [ "$BASH" ]; then
> if [ -f ~/.bashrc ]; then
> . ~/.bashrc
> fi
> fi
>
> mesg n
> -----------------------
>
> As you can see, it does have a invocation on mesg.

You might restrict the invocation of “mesg n” to an interactive
non-su login shell, the standard input of which is associated with
a terminal:

if
# Is this an interactive shell?
test " $-" != " ${-##*i*}" &&
# Does the shell's invocation basename differ from 'su' and
# '-su'?
( invoc_basename="${0##*/}" &&
test " ${invoc_basename#-}" != ' su'
) &&
# Is standard input associated with a terminal?
test -t 0
then
mesg n
fi

Barry Margolin

unread,
Apr 5, 2017, 12:01:11 PM4/5/17
to
In article <oc18pb$4kp$1...@aspen.stu.neva.ru>,
Hongyi Zhao <hongy...@gmail.com> wrote:

> On Tue, 04 Apr 2017 13:59:06 -0400, Barry Margolin wrote:
>
> > It's not uncommon for .profile to assume that it's running in an
> > interactive terminal. It's only run in login shells,
>
> All these are the the default settings shipped with Debian Jessie, and
> you can see the info about the os:
>
> werner@debian-01:~$ lsb_release -a
> No LSB modules are available.
> Distributor ID: Debian
> Description: Debian GNU/Linux 8.7 (jessie)
> Release: 8.7
> Codename: jessie
>
> > and you have to go
> > out of your way to make a non-interactive login shell.
>
> You mean put the code into .bashrc?
>
> Regards

No, I mean redirecting the input to "su -l".

Actually, I went back to the OP, and I'm not sure why .profile was run
in the first place. The command was

su root <<EOF
...
EOF

That shouldn't create a login shell, so it should only run .bashrc, not
.profile.

Hongyi Zhao

unread,
Apr 7, 2017, 8:46:16 PM4/7/17
to
On Wed, 05 Apr 2017 11:59:20 -0400, Barry Margolin wrote:

> su root <<EOF ...
> EOF

This method will not work just as the things previously discussed in this
thread. It will throw the error like this:

werner@debian-01:~$ PS2='? '
werner@debian-01:~$ su root <<EOF
? ls
? EOF
su: must be run from a terminal
werner@debian-01:~$

Hongyi Zhao

unread,
Jun 12, 2017, 9:32:19 AM6/12/17
to
On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:

> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> su 3<<EOF

Sorry for long later reply on this thread again.

In fact, I've tried with the file descriptor larger than 2, say, 3, 4,
5, ..., and all of them works just as the above code. So, why you
specifically use file descriptor #3 here?

Barry Margolin

unread,
Jun 12, 2017, 11:27:44 AM6/12/17
to
In article <ohm54v$kpt$1...@aspen.stu.neva.ru>,
Hongyi Zhao <hongy...@gmail.com> wrote:

> On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:
>
> > su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> > su 3<<EOF
>
> Sorry for long later reply on this thread again.
>
> In fact, I've tried with the file descriptor larger than 2, say, 3, 4,
> 5, ..., and all of them works just as the above code. So, why you
> specifically use file descriptor #3 here?
>
> Regards

He has to pick something, 3 is the first available FD.

Hongyi Zhao

unread,
Jun 12, 2017, 8:08:02 PM6/12/17
to
On Fri, 17 Mar 2017 08:58:03 +0100, Helmut Waitzmann wrote:

> Example:
>
> aa=123
> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
> -s aa "$aa" bb ';cd /;rm -Rf "$HOME"' -- \
> 3<<\EOF while test -n "${1+defined}"
> do
> case "$1" in
> ?*)
> if test -z "${2+defined}"
> then
> printf >&2 '%s: missing value for variable %s\n' \
> "$0" "$1"
> exit 1
> fi eval "${1:?}="'"${2?}"' shift 2;;
> --)
> # end of variable list shift; break;;
> '')
> printf >&2 \
> '%s: The null string is not a variable name.\n' \
> "$0"
> exit 1;;
> esac
> done echo $aa $bb
> EOF

I save the above script into a file named as pass-var-into-su.sh and then
test it, but obtaining the following output:

$ bash pass-var-into-su.sh
Password:
/bin/bash: missing value for variable --

I cann't see any expanding of the var's value.

Helmut Waitzmann

unread,
Jun 13, 2017, 1:07:21 AM6/13/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:
>
>> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
>> su 3<<EOF
>
> Sorry for long later reply on this thread again.
>
> In fact, I've tried with the file descriptor larger than 2, say, 3, 4,
> 5, ..., and all of them works just as the above code.

Yes, you are right.

> So, why you specifically use file descriptor #3 here?

I could have used any unused file descriptor. There is nothing
special with #3 here. It's just the smallest available (#0, #1,
and #2 are already in use).

Helmut Waitzmann

unread,
Jun 13, 2017, 1:42:32 AM6/13/17
to
Hongyi Zhao <hongy...@gmail.com>:
Yes, that was my fault. In the case construct, the pattern “--”
should precede the pattern “?*”:

while test -n "${1+defined}"
do
case "$1" in
--)
# end of variable list: stop processing variables
shift; break;;
?*)
if test -z "${2+defined}"
then
printf >&2 \
'%s: missing value for variable %s\n' \
"$0" "$1"
exit 1
fi
eval "${1:?}="'"${2?}"'
shift 2;;
'')
printf >&2 \
'%s: The null string is not a variable name.\n' \
"$0"
exit 1;;
esac
done

To get it even more robust, I think, the assignments should be
passed by “variable=value” parameters rather than “variable value”
pairs of parameters:

while test "$#" -ge 1
do
case "$1" in
--)
# end of variable list: stop processing variables
shift; break;;
?*=*)
eval "${1%%=*}="'"${1#*=}"'
shift;;
?*)
printf >&2 \
'%s: %s is not a variable assignment.\n' \
"$0" "$1"
exit 1;;
esac
done

You can use it like this:

aa=123
su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
-s aa="$aa" bb='some value' -- some positional parameters \
3<<\EOF
while test "$#" -ge 1
do
case "$1" in
--)
# end of variable list: stop processing variables
shift; break;;
?*=*)
eval "${1%%=*}="'"${1#*=}"'
shift;;
?*)
printf >&2 \
'%s: %s is not a variable assignment.\n' \
"$0" "$1"
exit 1;;
esac
done
printf '%s\n' aa="$aa" bb="$bb" 'positional parameters:' "$@"
EOF

Hongyi Zhao

unread,
Jun 13, 2017, 8:58:36 PM6/13/17
to
On Tue, 13 Jun 2017 07:42:09 +0200, Helmut Waitzmann wrote:

> eval "${1%%=*}="'"${1#*=}"'

Why must use both single and double quotation marks here?

Kaz Kylheku

unread,
Jun 13, 2017, 9:12:52 PM6/13/17
to
On 2017-06-14, Hongyi Zhao <hongy...@gmail.com> wrote:
> On Tue, 13 Jun 2017 07:42:09 +0200, Helmut Waitzmann wrote:
>
>> eval "${1%%=*}="'"${1#*=}"'
>
> Why must use both single and double quotation marks here?

Because there are two rounds of evaluation going on.
We have an eval command which is evaluated.
That eval causes its arguments to be evaluated again:

eval "${1%%=*}="'"${1#*=}"'
^^^^^^^^^^^

This syntax needs to be expanded right away,
so that the expansion is passed to eval:
the expansion is a calculated variable name
followed by an equal sign, like FOO=


eval "${1%%=*}="'"${1#*=}"'
^^^^^^^^^

This syntax must pass verbatim to the
second evaluation round. So it is
wrapped in single quotes. Thus the eval
will evaluate the computed assignment
having a form like: FOO="${1#*=}"


Hongyi Zhao

unread,
Jun 15, 2017, 6:22:59 AM6/15/17
to
On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:

> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> su 3<<EOF

Another issue: by using the construction -c '...' in the above code, this
will disable the variables expansion. Why still the "$SHELL" and ${1
+"$@"} parts still can be expanded correctly and executed accordingly?

Furthermore, should I use

-c '...'

or

-c "..."

in the above code line given by you?

Barry Margolin

unread,
Jun 15, 2017, 10:23:07 AM6/15/17
to
In article <ohtn5v$ucu$1...@aspen.stu.neva.ru>,
Hongyi Zhao <hongy...@gmail.com> wrote:

> On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:
>
> > su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
> > su 3<<EOF
>
> Another issue: by using the construction -c '...' in the above code, this
> will disable the variables expansion. Why still the "$SHELL" and ${1
> +"$@"} parts still can be expanded correctly and executed accordingly?

They're expanded by the new shell process that "su" runs.

>
> Furthermore, should I use
>
> -c '...'
>
> or
>
> -c "..."
>
> in the above code line given by you?

If you use single quotes, the variables are expanded by the new shell.
If you use double quotes, the variables are expanded by the original
shell.

Kaz Kylheku

unread,
Jun 15, 2017, 11:40:36 AM6/15/17
to
On 2017-06-15, Hongyi Zhao <hongy...@gmail.com> wrote:
> On Tue, 14 Mar 2017 06:54:47 +0100, Helmut Waitzmann wrote:
>
>> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
>> su 3<<EOF
>
> Another issue: by using the construction -c '...' in the above code, this
> will disable the variables expansion.

It will disable any variable expansion when the whole -c '...'
argument is processed here, before "su" is dispatched.

> Why still the "$SHELL" and ${1
> +"$@"} parts still can be expanded correctly and executed accordingly?

$ man su
[...]

OPTIONS
The options which apply to the su command are:

-c, --command COMMAND
Specify a command that will be invoked by the shell using its -c.

What part isn't clear? The syntax between the '...' in su -c '...' is
treated as a shell command.

Here is a C program:

#include <stdlib.h>
int main(int argc, char **argv)
{
system("echo $TERM");
return 0;
}

The C language compiler certainly doesn't expand shell variables in string
literals. Yet, the value of TERM gets printed. How come?

The su program is essentially the same as the above. It finds that some
argument argv[i] contains "-c" and so it does something resembling
system(argv[i+1]) to run the following one as a shell command.

> Furthermore, should I use
>
> -c '...'
>
> or
>
> -c "..."
>
> in the above code line given by you?

Strictly speaking, the code line given by Helmutt Weitzmann *doesn't*
use "...", and so you cannot.

If you make that substitution, it is no longer the line given by Helmutt
Weitzmann.

Helmut Waitzmann

unread,
Jun 15, 2017, 5:43:24 PM6/15/17
to
Kaz Kylheku <686-67...@kylheku.com>:
Not exactly. “su” will use the “execl()” library function (or a
variant of it) rather than the “system()” library function.

When “su” parses its arguments given by the shell
command line

“su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' \
su 3<<EOF”,

it encounters the first argument, “--”, which tells it to stop
option processing, that is, all remaining arguments are meant to
not be “su” options, even if they start with a dash (“-”).

In the next argument (which in this case is the second one), it
expects either a single dash (“-”) to indicate, that the shell to
be started should be a login shell, or a user name for the target
user (which is the case here: “root”).

(If this argument were “-” rather than “root”, a following
additional argument would be the target user's name.)

Then “su” looks up the target user's shell in the user database,
which, for example, be “/bin/bash”.

“su” asks for the password of the target user, sets up a (basic)
process environment, changes its process credentials to the target
user, and eventually executes the target user's shell by means of
a call to the “execl()” system library function.

To call that function, “su” constructs that function's argument
list:

* The first argument will be the path name of root's shell, for
example, “/bin/bash”.

* The second argument will be (in this case) the base name of the
first argument: “bash”.

“su” copies all remaining arguments as arguments to the system
library function call, as would be the case, if you wrote a C
program containing the following function call. So it won't
bother to interpret its third argument (“-c”) to be the su option
“-c”:

execl(
"/bin/bash", "bash", "-c",
"exec 0<&3 3<&- && \"$SHELL\" ${1+\"$@\"}",
"su", (const char *) NULL
)

(Note: The “\"” sequences are C's notation for quotation marks in
strings.)

That function eventually will execute a “/bin/bash“, giving it the
invocation name “bash” and supplying the arguments

“-c”,
“exec 0<&3 3<&- && "$SHELL" ${1+"$@"}”, and
“su”.

The same would happen, if you typed the command line

“/bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su”,

which of cause is very similar to the original command line,
above.

>
>> Furthermore, should I use
>>
>> -c '...'
>>
>> or
>>
>> -c "..."
>>
>> in the above code line given by you?

If you used

“su -- root -c "exec 0<&3 3<&- && "$SHELL" ${1+"$@"}" \
su 3<<EOF”

you would get a totally different, wrong, argument list for “su”,
for “execl()“, and eventually for the target user's shell, because
the part

“"exec 0<&3 3<&- && "$SHELL" ${1+"$@"}"”

of the command line would be mangled by the invoking shell: It
would construct that part of the command line for “su” as follows:

A first word of this part of the command line would be the
concatenation of the following strings, split by the characters of
the “IFS” shell variable in the value of the “SHELL” shell
variable:

* “exec 0<&3 3<&- && ”,

* the contents of the shell variable “SHELL”, for example
“/bin/zsh“ (if you happen to have “/bin/zsh” as the contents of
your shell variable “SHELL”),

* “ ”, and

* the first positional parameter of your invoking shell, if any.

Any remaining positional parameters of your invoking shell would
make up a second, third, … word of this part of the command line.

If, for example, there were no positional parameters in your
interactive shell, and the contents of the “SHELL” shell variable
were “/bin/zsh”, the command line would be equivalent to the
command line

“su -- root -c 'exec 0<&3 3<&- && /bin/zsh ' \
su 3<<EOF”.

As a rule of thumb:

If you want to pass an arbitrary string as part of a command line
as an invocation argument to a command, enclose that string in
apostrophes (“'”) rather than in quotation marks (“"”), for
example

“'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}'”.

If you want to pass the contents of a shell variable as part of a
command line as an invocation argument to a command, enclose that
variable expansion in quotation marks (“"”), for example

“"$SHELL"”.

Hongyi Zhao

unread,
Jun 15, 2017, 9:19:33 PM6/15/17
to
On Thu, 15 Jun 2017 23:43:01 +0200, Helmut Waitzmann wrote:

> The same would happen, if you typed the command line
>
> “/bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su”,
>
> which of cause is very similar to the original command line, above.

But, I tried the following:

$ /bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
ls
EOF

This will not need to supply the password for running su. Why?

Helmut Waitzmann

unread,
Jun 15, 2017, 10:19:37 PM6/15/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Thu, 15 Jun 2017 23:43:01 +0200, Helmut Waitzmann wrote:
>
>> The same would happen, if you typed the command line
>>
>> “/bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su”,
>>
>> which of cause is very similar to the original command line, above.
>
> But, I tried the following:
>
> $ /bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
> ls
> EOF
>
> This will not need to supply the password for running su. Why?

Of cause, not. The command line

“/bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su”

describes, what “su” does, /after/ it has verified the password,
set up a process environment and changed the process credentials
to “root”: It calls the “execl()” system library function like a
shell, when you give it the command line named above, does.

Helmut Waitzmann

unread,
Jun 15, 2017, 11:33:08 PM6/15/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Thu, 15 Jun 2017 23:43:01 +0200, Helmut Waitzmann wrote:
>
>> The same would happen, if you typed the command line
>>
>> “/bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su”,
>>
>> which of cause is very similar to the original command line, above.
>
> But, I tried the following:
>
> $ /bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
> ls
> EOF
>
> This will not need to supply the password for running su. Why?

It will not run “su”. It will just run a “/bin/bash”, giving it
the invocation arguments
“bash”,
“-c”,
“exec 0<&3 3<&- && "$SHELL" ${1+"$@"}”, and
“su”.

The last argument, “su”, will be assigned to the positional
parameter “$0”.

Look at the bash(1) manual page:

OPTIONS
In addition to the single-character shell options
documented in the description of the set builtin command,
bash interprets the following options when it is invoked:

-c string If the -c option is present, then commands are
read from string. If there are arguments after
the string, they are assigned to the positional
parameters, starting with $0.

In the example above, the bash's positional parameter $0 will be
“su”.

Helmut Waitzmann

unread,
Jun 16, 2017, 12:22:20 AM6/16/17
to
Helmut Waitzmann <nn.th...@xoxy.net>:
> Hongyi Zhao <hongy...@gmail.com>:
>> On Thu, 15 Jun 2017 23:43:01 +0200, Helmut Waitzmann wrote:
>>
>>> The same would happen, if you typed the command line
>>>
>>> “/bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su”,
>>>
>>> which of cause is very similar to the original command line, above.
>>
>> But, I tried the following:
>>
>> $ /bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
>> ls
>> EOF
>>
>> This will not need to supply the password for running su. Why?
>
> It will not run “su”. It will just run a “/bin/bash”, giving it
> the invocation arguments
> “bash”,
> “-c”,
> “exec 0<&3 3<&- && "$SHELL" ${1+"$@"}”, and
> “su”.

If you give the “id” rather than the “ls” command, you can see
that. Try:

$ /bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
id
EOF

Hongyi Zhao

unread,
Jun 16, 2017, 8:24:29 AM6/16/17
to
On Fri, 16 Jun 2017 06:21:57 +0200, Helmut Waitzmann wrote:

> If you give the “id” rather than the “ls” command, you can see that.
> Try:
>
> $ /bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
> id
>EOF

I tried with and without using ``su'' in the above code, and both of them
gives the same results:

$ /bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su 3<<EOF
id
EOF
uid=1000(werner) gid=1000(werner) groups=1000(werner),24(cdrom),25
(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev),111
(scanner),115(bluetooth)

$ /bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' 3<<EOF
id
EOF
uid=1000(werner) gid=1000(werner) groups=1000(werner),24(cdrom),25
(floppy),29(audio),30(dip),44(video),46(plugdev),108(netdev),111
(scanner),115(bluetooth)

So, why must you use ``su'' here?

Helmut Waitzmann

unread,
Jun 16, 2017, 1:12:14 PM6/16/17
to
Hongyi Zhao <hongy...@gmail.com>:
As long as you don't supply additional arguments and and you are
not going to call a login shell, in your example might be no
difference between supplying that “su” argument and not supplying
it. (Whether actually there /is/ a difference anyway, depends on
the shell to be called and on its startup files.)

But if you intend to supply any additional arguments, that
argument will be mandatory.

Look at the “bash(1)” manual page in the section “OPTIONS”:

In addition to the single-character shell options
documented in the description of the set builtin command,
bash interprets the following options when it is invoked:

-c string If the -c option is present, then commands are
read from string. If there are arguments after
the string, they are assigned to the positional
parameters, starting with $0.

In your example, the “-c” option is present and “su” will
be assigned to the positional parameter “"$0"”. Additional
arguments will be assigned to the positional parameters “"$@"”.

See also your posting <news:oa84ej$cjn$1...@dont-email.me> (where you
asked, why I supplied two “su” commands) and my followup
<news:87d1dih...@helmutwaitzmann.news.arcor.de>:

From: Helmut Waitzmann <nn.th...@xoxy.net>
Newsgroups: comp.unix.shell
Subject: Re: su: must be run from a terminal
Reply-To: Helmut Waitzmann Anti-Spam-Ticket.b.qc3c
<oe.th...@xoxy.net>
Mail-Reply-To: Helmut Waitzmann Anti-Spam-Ticket.b.qc3c
<oe.th...@xoxy.net>
Mail-Copies-To: nobody
Date: Wed, 15 Mar 2017 16:48:38 +0100
Message-ID: <87d1dih...@helmutwaitzmann.news.arcor.de>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux)
References: <oa68hg$p7t$1...@dont-email.me>
<8760jci...@helmutwaitzmann.news.arcor.de>
<oa84ej$cjn$1...@dont-email.me>
Cancel-Lock: sha1:7rP9O7GaEGoz3FB9i3SnxNCQ49Y=
MIME-Version: 1.0

See also your posting <news:oadb4g$o64$1...@aspen.stu.neva.ru>, where
you asked, if it were possible to pass shell variables to a
here-document. In my followup, I suggested, to pass them by means
of additional arguments and to use a while loop to let the shell
process its positional parameters to retrieve the variables:

Subject: Re: su: must be run from a terminal
From: Helmut Waitzmann <nn.th...@xoxy.net>
Reply-To: Helmut Waitzmann Anti-Spam-Ticket.b.qc3c
<oe.th...@xoxy.net>
Mail-Reply-To: Helmut Waitzmann Anti-Spam-Ticket.b.qc3c
<oe.th...@xoxy.net>
Mail-Copies-To: nobody
Newsgroups: comp.unix.shell
References: <oa68hg$p7t$1...@dont-email.me>
<8760jci...@helmutwaitzmann.news.arcor.de>
<oadb4g$o64$1...@aspen.stu.neva.ru>
<871stwe...@helmutwaitzmann.news.arcor.de>
<ohnacv$1h4$1...@aspen.stu.neva.ru>
Date: Tue, 13 Jun 2017 07:42:09 +0200
Message-ID: <87ink03...@helmutwaitzmann.news.arcor.de>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux)
MIME-Version: 1.0

If you want to do that, then the “su” argument is mandatory:

For example:

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
-s -- dir="$HOME" -- */ \
3<<\EOF
while test "$#" -ge 1
do
if test " $1" = ' --'
then
# end of variable list: stop processing variables
shift
break
elif LC_ALL=C \
expr " $1" : ' [[:alpha:]_][[:alnum:]_]*=' > /dev/null
then
if eval "${1%%=*}="'"${1#*=}"'
then
shift
else
printf '%s:\nThe variable assignment\n%s\nfailed.\n' \
"$0" "$1" >&2
return 1
fi
else
printf '%s:\n%s\nis not a variable assignment.\n' \
"$0" "$1" >&2
return 1
fi
done
printf '%s\n' "$HOME" "$dir" "$@"
EOF

Hongyi Zhao

unread,
Jun 21, 2017, 5:00:15 AM6/21/17
to
On Fri, 16 Jun 2017 19:11:52 +0200, Helmut Waitzmann
<nn.th...@xoxy.net> wrote:

>For example:
>
> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
> -s -- dir="$HOME" -- */ \
> 3<<\EOF
> while test "$#" -ge 1
> do
> if test " $1" = ' --'
> then
> # end of variable list: stop processing variables
> shift
> break

I think for some time on the `break' used here, but still now so
clear about the logic here. In detail:

`break' will let the code exit the while loop. So, how the while loop
can still do the subsequent parameters analysis?

> elif LC_ALL=C \

Why you use LC_ALL=C here? I noted that you don't use this line in
the previous version of the code for similar purpose.

> expr " $1" : ' [[:alpha:]_][[:alnum:]_]*=' > /dev/null
> then
> if eval "${1%%=*}="'"${1#*=}"'

Is this needed really? I mean, when will the `eval' failed to do the
job?

> then
> shift
> else
> printf '%s:\nThe variable assignment\n%s\nfailed.\n' \
> "$0" "$1" >&2
> return 1
> fi
> else
> printf '%s:\n%s\nis not a variable assignment.\n' \
> "$0" "$1" >&2
> return 1
> fi
> done
> printf '%s\n' "$HOME" "$dir" "$@"
> EOF

Regards

Helmut Waitzmann

unread,
Jun 21, 2017, 8:26:04 PM6/21/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Fri, 16 Jun 2017 19:11:52 +0200, Helmut Waitzmann
> <nn.th...@xoxy.net> wrote:
>
>>For example:
>>
>> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
>> -s -- dir="$HOME" -- */ \
>> 3<<\EOF
>> while test "$#" -ge 1
>> do
>> if test " $1" = ' --'
>> then
>> # end of variable list: stop processing variables
>> shift
>> break
>
> I think for some time on the `break' used here, but still now so
> clear about the logic here. In detail:
>
> `break' will let the code exit the while loop.

Yes. That's on purpose.

> So, how the while loop can still do the subsequent parameters
> analysis?

As soon as the while loop encounters a “--” (two dashes) argument
(“test " $1" = ' --'”), it removes that argument from the argument
list (“shift”) and then stops the subsequent arguments' analysis,
letting the subsequent arguments remain as plain positional
parameters rather than variable assignments.

This allows you to pass additional arguments, that look like
variable assignments, but are meant to be plain positional
parameters, to the command.

Therefore you can call it with a (possibly empty) list of variable
assignments followed by “--” and an (possibly empty) list of
additional positional parameters, as was the case with the example
(see the first three lines of the example):

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
-s -- dir="$HOME" -- */ \
3<<\EOF

“dir="$HOME"” is one argument meant to be a variable assignment,
“--” stops the assignment processing, and “*/” are additional
positional parameters. Imagine, what would happen, if you'd
happen to have a subdirectory called “hello=world” and no
assignment stopper (“--”).

>> elif LC_ALL=C \
>
> Why you use LC_ALL=C here? I noted that you don't use this line in
> the previous version of the code for similar purpose.

“LC_ALL=C” ensures, that the character class “[:alpha:]” (as
“expr” understands it) consists solely of the 26 uppercase and 26
lowercase letters of the latin alphabet, and, that the character
class “[:alnum:]” consists of the 26 uppercase and 26 lowercase
letters of the latin alphabet plus the digits 0 to 9, regardless
of what the default locale is. In the POSIX shell, variable names
are made up of a leading letter of the latin alphabet or an
underscore, followed up by zero or more letters of the latin
alphabet, underscores or digits. This is, what the commandline

“LC_ALL=C expr " $1" : ' [[:alpha:]_][[:alnum:]_]*=' > /dev/null”

tests for.

>> expr " $1" : ' [[:alpha:]_][[:alnum:]_]*=' > /dev/null
>> then
>> if eval "${1%%=*}="'"${1#*=}"'
>
> Is this needed really? I mean, when will the `eval' failed to do the
> job?

For example, may be, that some shells have a restriction, in how long a
variable name is allowed to be (I don't know). I am just careful
here, as I don't want to risk the command to be run with incomplete or
wrong variable assignments made.

Hongyi Zhao

unread,
Jun 21, 2017, 9:47:09 PM6/21/17
to
On Thu, 22 Jun 2017 02:25:43 +0200, Helmut Waitzmann wrote:

> As soon as the while loop encounters a “--” (two dashes) argument (“test
> " $1" = ' --'”),

In your previous ``case-command-based'' version, you do the test as
follows:

case "$1" in
--)

It seems the case command will more concise for the same purpose, why
here you changed to use test command for this purpose?

Hongyi Zhao

unread,
Jun 21, 2017, 10:08:18 PM6/21/17
to
On Thu, 22 Jun 2017 02:25:43 +0200, Helmut Waitzmann wrote:

> Therefore you can call it with a (possibly empty) list of variable
> assignments followed by “--” and an (possibly empty) list of additional
> positional parameters, as was the case with the example (see the first
> three lines of the example):
>
> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
> -s -- dir="$HOME" -- */ \
> 3<<\EOF
>
> “dir="$HOME"” is one argument meant to be a variable assignment, “--”
> stops the assignment processing, and “*/” are additional positional
> parameters. Imagine, what would happen, if you'd happen to have a
> subdirectory called “hello=world” and no assignment stopper (“--”).

But the previous version you told me is as follows:

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
-s aa="$aa" bb='some value' -- some positional parameters \
3<<\EOF

This version only has one “--” here, i.e., the following part in the
above code:

aa="$aa" bb='some value' -- some positional parameters


But in your latter version, you use tow “--” for the same purpose, i.e.,
the following part in the latter version of your code:

-- dir="$HOME" -- */

If one “--” is enough for the same purpose, why you will use two “--”
in the latter version?

Hongyi Zhao

unread,
Jun 21, 2017, 10:17:56 PM6/21/17
to
On Thu, 22 Jun 2017 02:25:43 +0200, Helmut Waitzmann wrote:

> “LC_ALL=C expr " $1" : ' [[:alpha:]_][[:alnum:]_]*=' > /dev/null”
>
> tests for.

IMO, without using the expr command, the above also can be done by the ``
[[ ... ]]'' construction within bash:

“LC_ALL=C [[ " $1" =~ ' [[:alpha:]_][[:alnum:]_]*=' ]] > /dev/null”

Helmut Waitzmann

unread,
Jun 22, 2017, 11:27:08 AM6/22/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Thu, 22 Jun 2017 02:25:43 +0200, Helmut Waitzmann wrote:
>
>> As soon as the while loop encounters a “--” (two dashes) argument (“test
>> " $1" = ' --'”),
>
> In your previous ``case-command-based'' version, you do the test as
> follows:
>
> case "$1" in
> --)
>
> It seems the case command will more concise for the same purpose, why
> here you changed to use test command for this purpose?

With the “case” construct, all tests are pattern matching tests.
If I want to mix different sorts of tests: “test” and “expr”, I've
to resort on the “if … elif” construct and can no longer
use the “case” construct.

Helmut Waitzmann

unread,
Jun 22, 2017, 11:49:42 AM6/22/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Thu, 22 Jun 2017 02:25:43 +0200, Helmut Waitzmann wrote:
>
>> “LC_ALL=C expr " $1" : ' [[:alpha:]_][[:alnum:]_]*=' > /dev/null”
>>
>> tests for.
>
> IMO, without using the expr command, the above also can be done
> by the `` [[ ... ]]'' construction within bash:
>
> “LC_ALL=C [[ " $1" =~ ' [[:alpha:]_][[:alnum:]_]*=' ]] > /dev/null”

As bash's “[[ … =~ … ]]” construct is not covered by the POSIX
standard, I haven't used it yet and don't know exactly, what it does.

Prepending “LC_ALL=C” won't work anyway, because “[[ … ]]” is a
compound command (“[[” and “]]” are reserved words, whereas “[”
and “test” are not):

Letting bash execute the command line

“LC_ALL=C [[ ' var=value' =~ ' [[:alpha:]_][[:alnum:]_]*=' ]]”

results in the following error message:

bash: [[: command not found

This is because the “LC_ALL=C” variable assignment forces “[[” to
be searched for as a simple command.

Hongyi Zhao

unread,
Jun 22, 2017, 11:05:23 PM6/22/17
to
On Thu, 22 Jun 2017 17:49:35 +0200, Helmut Waitzmann wrote:

> As bash's “[[ … =~ … ]]” construct is not covered by the POSIX standard,
> I haven't used it yet and don't know exactly, what it does.
>
> Prepending “LC_ALL=C” won't work anyway, because “[[ … ]]” is a compound
> command (“[[” and “]]” are reserved words, whereas “[”
> and “test” are not):
>
> Letting bash execute the command line
>
> “LC_ALL=C [[ ' var=value' =~ ' [[:alpha:]_][[:alnum:]_]*=' ]]”
>
> results in the following error message:
>
> bash: [[: command not found
>
> This is because the “LC_ALL=C” variable assignment forces “[[” to be
> searched for as a simple command.

Thanks a lot for your explanation.

Helmut Waitzmann

unread,
Jun 23, 2017, 7:46:07 AM6/23/17
to
Hongyi Zhao <hongy...@gmail.com>:
I'm sorry. I should have used the “--” following the shell option
“-s” in the first version as well. In both versions, it's
optional, because the first non-option parameter for the
“"$SHELL"” (“aa="$aa"” and “dir="$HOME"”, resp.) happens not to
start with a “-”, but in an example like

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
-s -- -- no variable assignments, just additional arguments \
3<<\EOF

where the first non-option argument of the “"$SHELL"” starts with
a “-”, the “--” shell invocation option stopper is mandatory. So,
to get the correct behavior, regardless, whether the first
non-option parameter of the “"$SHELL"” start with a “-” or not, I
suggest always to put an option stopper (“--”) before it.

And there is an error in the here-document: The “return 1”
commands are wrong. They should be “exit 1” commands. (The
“return 1” commands only work, when the loop is put into a shell
script, which is executed by means of the “.” command.)

I'll try to explain, what's going on here. In the example

su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
-s -- -- no variable assignments, just additional arguments \
3<<\EOF
while test "$#" -ge 1
do
if test " $1" = ' --'
then
# end of variable list: stop processing variables
shift
break
elif LC_ALL=C \
expr " $1" : ' [[:alpha:]_][[:alnum:]_]*=' > /dev/null
then
if eval "${1%%=*}="'"${1#*=}"'
then
shift
else
printf '%s:\nThe variable assignment\n%s\nfailed.\n' \
"$0" "$1" >&2
exit 1
fi
else
printf '%s:\n%s\nis not a variable assignment.\n' \
"$0" "$1" >&2
exit 1
fi
done
printf '%s\n' 'These are the positional parameters:' "$@"
EOF

the invoking shell parses this command, which uses redirection
From a here-document.

The shell puts the text of the here-document in a temporary file,
then opens that file for reading and redirects the file descriptor
#3 to the opened file. Eventually it calls “su”, giving it the
arguments

“--”, “root”, “-c”, “exec 0<&3 3<&- && "$SHELL" ${1+"$@"}”,
“su”, “-s”, “--”, “--”, “no”, “variable”, “assignments,”, “just”,
“additional”, and “arguments”.

“su”, when parsing its arguments, encounters the “--” argument,
which tells “su” to stop option processing. The next argument
shall either be the target user name (which is the case here) or a
“-” followed by an additional argument: the target user name.
“su” eventually invokes root's shell (may it be “/bin/bash”),
passing it all remaining arguments, which in this example are

“-c”, “exec 0<&3 3<&- && "$SHELL" ${1+"$@"}”, “su”, “-s”, “--”,
“--”, “no”, “variable”, “assignments,”, “just”, “additional”, and
“arguments”, as if one had started it with the command line

/bin/bash -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
-s -- -- no variable assignments, just additional arguments

That bash parses its arguments: “-c” tells it to expect a command
line in the following argument and to assign all remaining
arguments to the shell special parameters: The first of them is
assigned to “"$0"” (in this example: “su”), the remaining ones are
assigned to “"$@"” (in this example: “-s”, “--”, “--”, “no”,
“variable”, “assignments,”, “just”, “additional”, and
“arguments”).

Now it executes its command line: It redirects file descriptor #0
to file descriptor #3 (which happens to be the here-document),
closes file descriptor #3, and starts (assuming the environment
variable “SHELL” has got the value “/bin/bash”) a “/bin/bash”,
giving it the arguments “-s”, “--”, “--”, “no”, “variable”,
“assignments,”, “just”, “additional”, and “arguments” , as if it
had started it by the command line

“/bin/bash -s -- -- no variable assignments, just additional \
arguments”.

That bash examines its arguments: At first it encounters the “-s”
option, that tells it, to read commands from its standard input
(which was redirected to the here-document). Then it encounters
the “--” following the “-s”. The “--” causes the shell to stop
option processing: It discards the “--” and lets the
following arguments

“--”, “no”, “variable”, “assignments,”, “just”, “additional”, and
“arguments”

move up and remain as positional parameters, even, if they start
with a “-”; that is, they are accessible via the shell's “"$@"”
and “"$1"”, “"$2"”, … special parameters:

“"$1"” expands to “--”,
“"$2"” expands to “no”,
“"$3"” expands to “variable”,
“"$4"” expands to “assignments,”,
“"$5"” expands to “just”,
“"$6"” expands to “additional”, and
“"$7"” expands to “arguments”.

Then the shell reads commands from its standard input. In this
example the commands, which are read from standard input (the
here-document), are

while test "$#" -ge 1
do
if test " $1" = ' --'
then
# end of variable list: stop processing variables
shift
break
elif LC_ALL=C \
expr " $1" : ' [[:alpha:]_][[:alnum:]_]*=' > /dev/null
then
if eval "${1%%=*}="'"${1#*=}"'
then
shift
else
printf '%s:\nThe variable assignment\n%s\nfailed.\n' \
"$0" "$1" >&2
exit 1
fi
else
printf '%s:\n%s\nis not a variable assignment.\n' \
"$0" "$1" >&2
exit 1
fi
done
printf '%s\n' 'These are the positional parameters:' "$@"

Interpreting the “while” loop, the shell calls the command

“test 7 -ge 1“,

which yields exit code 0, and enters the body of the loop. Then
it tests the condition of the first “if” compound command, that
is, it calls the “test” command, expanding “"$1"” by “--”, as if
given by the command line

“test ' --' = ' --'”,

which yields exit code 0. The shell executes the first “then”
branch of the “if” compound command: It executes the command
“shift”, that is, it discards the positional parameter “"$1"”. So
the remaining positional parameters are these ones:

“"$1"” expands to “no”,
“"$2"” expands to “variable”,
“"$3"” expands to “assignments,”,
“"$4"” expands to “just”,
“"$5"” expands to “additional”, and
“"$6"” expands to “arguments”.

Then it executes the “break” command, exiting the loop. Finally,
it executes the “printf” command, as if it had been started by the
command line

“printf '%s\n' 'These are the positional parameters:' \
no variable assignments, just additional arguments”.

Hongyi Zhao

unread,
Jun 23, 2017, 8:59:50 PM6/23/17
to
On Fri, 23 Jun 2017 13:45:45 +0200, Helmut Waitzmann wrote:
[snipped]
> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
> -s -- -- no variable assignments, just additional arguments \
> 3<<\EOF while test "$#" -ge 1 do
> if test " $1" = ' --'

Why not using the following form without the space:

if test "$1" = '--'

[snipped]

> Now it executes its command line: It redirects file descriptor #0 to
> file descriptor #3 (which happens to be the here-document),
> closes file descriptor #3,

I'm a newbie on the file descriptors' inner-communication / management /
mechanism and asked the following maybe naive question:

It seems the file descriptor #3 will be closed immediately after
redirecting file descriptor #0 to it.

Does we need close the file descriptor #3 after all of the here-document
has been read successfully?

> and starts (assuming the environment variable
> “SHELL” has got the value “/bin/bash”) a “/bin/bash”,
> giving it the arguments “-s”, “--”, “--”, “no”, “variable”,
> “assignments,”, “just”, “additional”, and “arguments” , as if it had
> started it by the command line

[snipped]

Thanks a lot for your deep-in analysis and giving mature consideration to
all aspects of this question :-)

Helmut Waitzmann

unread,
Jun 24, 2017, 4:43:22 PM6/24/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Fri, 23 Jun 2017 13:45:45 +0200, Helmut Waitzmann wrote:
> [snipped]
>> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
>> -s -- -- no variable assignments, just additional arguments \
>> 3<<\EOF while test "$#" -ge 1 do
>> if test " $1" = ' --'
>
> Why not using the following form without the space:
>
> if test "$1" = '--'

I'm just cautious here. Some historical implementations of “test”
behaved wrong, when "$1" was '-', '(', '!' or '='.

See the comment in the APPLICATION USAGE section of the
specification of the POSIX “test” utility
(<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html#tag_20_128_16>):

Historical systems have also been unreliable given the common
construct:

test "$response" = "expected string"

One of the following is a more reliable form:

test "X$response" = "Xexpected string"
test "expected string" = "$response"

Note that the second form assumes that expected string could not
be confused with any unary primary. If expected string starts
with '-', '(', '!', or even '=', the first form should be used
instead. Using the preceding rules without the XSI marked
extensions, any of the three comparison forms is reliable, given
any input. (However, note that the strings are quoted in all
cases.)

Hongyi Zhao

unread,
Jun 24, 2017, 8:12:49 PM6/24/17
to
On Sat, 24 Jun 2017 22:42:59 +0200, Helmut Waitzmann wrote:

> One of the following is a more reliable form:
>
> test "X$response" = "Xexpected string"

So, based on your notes here, both of the two forms are robust:

if test " $1" = ' --'
if test "X$1" = 'X--'

> test "expected string" = "$response"

It seems this form is rarely used, even when it's safe/reliable.

Helmut Waitzmann

unread,
Jun 24, 2017, 9:10:00 PM6/24/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Fri, 23 Jun 2017 13:45:45 +0200, Helmut Waitzmann wrote:
> [snipped]
>> su -- root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' su \
>> -s -- -- no variable assignments, just additional arguments \
>> 3<<\EOF while test "$#" -ge 1 do
>> if test " $1" = ' --'

>> Now it executes its command line: It redirects file descriptor
>> #0 to file descriptor #3 (which happens to be the
>> here-document), closes file descriptor #3,
>
> I'm a newbie on the file descriptors' inner-communication /
> management / mechanism and asked the following maybe naive
> question:
>
> It seems the file descriptor #3 will be closed immediately after
> redirecting file descriptor #0 to it.

Yes.

In the operating system kernel, there is a system-wide open-files
table.

When a file is opened, the operating system allocates an entry in
the system-wide open-files table. Then it allocates an entry in
the process' file descriptor table. In this entry, it stores a
reference to the allocated entry in the system-wide open-files
table. Then it returns to the calling process the position of the
entry in the process' file descriptor table: the file descriptor
number.

In the entry in the system-wide open-files table some information
regarding that opened file is recorded: Is the file opened for
reading, for writing, or for both? Will writing to the file
overwrite or append data? What is the current access position in
the file?

Redirecting the file descriptor #0 to #3 means copying the
reference to the system-wide open-files table, which has been
stored in the entry #3 of the process' file descriptor table to
the entry #0 of the process' file descriptor table. So, file
descriptor redirecting actually is a misnomer. The file
descriptors #0 and #3 just refer to the same entry in the
system-wide open-files table.

When a file descriptor is closed, the operating system frees the
entry in the process' file descriptor table.

If all file descriptors, that refer to the same entry in the
system-wide open-file table, have been closed, then the operating
system frees that entry in the system-wide open-file table as
well.

> Does we need close the file descriptor #3 after all of the
> here-document has been read successfully?

Not only, after the here-document has been read: The file descriptor
#3 can and should be closed as soon as it has been copied to
the file descriptor #0.

I think, this is a sort of file descriptor hygiene: Close all file
descriptors you know of that no one will need or may use any
longer.

As the shell has duplicated the file descriptor #3 to the file
descriptor #0, it does not need the file descriptor #3 any longer.
By closing it, it frees it for other use.

If the shell didn't close the file descriptor #3, it might be
inherited by the called “"$SHELL"”, which even doesn't know of
that file descriptor.

See also <https://en.wikipedia.org/wiki/File_descriptor#top>.

Helmut Waitzmann

unread,
Jun 24, 2017, 9:20:35 PM6/24/17
to
Hongyi Zhao <hongy...@gmail.com>:

> So, based on your notes here, both of the two forms are robust:
>
> if test " $1" = ' --'
> if test "X$1" = 'X--'

Yes. They are.

Hongyi Zhao

unread,
Jun 25, 2017, 2:07:03 AM6/25/17
to
On Sun, 25 Jun 2017 03:09:46 +0200, Helmut Waitzmann wrote:

> Redirecting the file descriptor #0 to #3 means copying the reference to
> the system-wide open-files table, which has been stored in the entry #3
> of the process' file descriptor table to the entry #0 of the process'
> file descriptor table. So, file descriptor redirecting actually is a
> misnomer. The file descriptors #0 and #3 just refer to the same entry
> in the system-wide open-files table.

Ok, let's return to the original question of mine in this thread and the
answer give by you:

----------------- quoting begin from here -------------------
Path:
aspen.stu.neva.ru!goblin1!goblin.stu.neva.ru!news.albasani.net!.POSTED!
not-
for-mail
From: Helmut Waitzmann <nn.th...@xoxy.net>
Newsgroups: comp.unix.shell
Subject: Re: su: must be run from a terminal
Date: Tue, 14 Mar 2017 06:54:47 +0100
Organization: albasani.net
Lines: 59
Message-ID: <8760jci...@helmutwaitzmann.news.arcor.de>
References: <oa68hg$p7t$1...@dont-email.me>
Reply-To: Helmut Waitzmann Anti-Spam-Ticket.b.qc3c <oe.th...@xoxy.net>
Mime-Version: 1.0
X-Trace: news.albasani.net
cRasz/UNczw/UVgxZ2E31j9ggcKNoh9/
oRQM69nngpOxfVckXMq21beJbiyVau1neczgcbj/765
hopdS2M5NstbuUS5vKnHss8CfUwHnCzVmZs7ee4dZ5q5K5BCR+mJO
NNTP-Posting-Date: Tue, 14 Mar 2017 05:55:13 +0000 (UTC)
Injection-Info: news.albasani.net;
logging-data="o/liCWvBqI8IUbj26wofp8hCt553VgOzHzrQGEdY/
Vh9oBHGMWOjd1QRgoCCV
rn5FczrSrqFRx+Xday0MgdspGkIFVwdhph63pbX/
jbWtTyzmXt3nk9yuXYbcAhz6SSc";
mail-complaints-to="ab...@albasani.net"
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux)
Mail-Reply-To: Helmut Waitzmann Anti-Spam-Ticket.b.qc3c
<oe.th...@xoxy.net>
Cancel-Lock: sha1:HdxHPtVuCU6JrJV+dLEk628vn9Y=
sha1:NKUxPObHgj4vHfQt5UjNDHSr7/c=
Mail-Copies-To: nobody
Xref: aspen.stu.neva.ru comp.unix.shell:49883
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

Hongyi Zhao <hongy...@gmail.com>:
> Hi all,
>
> I try to use su to execute some commands with heredoc in my script like
> follows:
>
> su root <<EOF
> bla
> bla
> ...
> EOF

As there is no means to tell su to redirect standard input to file
descriptor #3 after having read the password from standard input
but before executing the shell, the redirection has to be done by
the shell that is executed by su.

As I understand now, you draw the above conclusion is based on the
following fact:

The #0 is already used for reading the password from standard input (in
kernel, the standard input is always #0). So, the su cann't using #0 for
reading the here-doc from standard input at the same time.

When using the here-doc to input some stuff to to su, considering that
the #0 is preserved to used to su for reading the password from standard
input, as a result, the kernel must pick up a FD greater than 2 for this
purpose.

Am I right?

As far as I understand one can't tell a shell to redirect file
descriptor #0 to file descriptor #3 and then read commands from
standard input.

This is because we cann't use the same file descriptor to do different
things at the same time, i.e., reading the password from stdin and
reading the here-doc from stin meanwhile.

Am I right?

But one can tell a shell to redirect descriptor #0 to file
descriptor #3 and then start a new shell.

By this method, we will let the original su read the password from the
#0, while the new started shell will be sub-shell and it will be
allocated a new #0 which is different from the original su's #0.

So, we can redirect the new shell's descriptor #0 to the file
descriptor #3.

Am I right?
----------------- quoting ends here -------------------

Helmut Waitzmann

unread,
Jun 25, 2017, 7:54:08 PM6/25/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Sun, 25 Jun 2017 03:09:46 +0200, Helmut Waitzmann wrote:
>
>> Redirecting the file descriptor #0 to #3 means copying the reference to
>> the system-wide open-files table, which has been stored in the entry #3
>> of the process' file descriptor table to the entry #0 of the process'
>> file descriptor table. So, file descriptor redirecting actually is a
>> misnomer. The file descriptors #0 and #3 just refer to the same entry
>> in the system-wide open-files table.
>
> Ok, let's return to the original question of mine in this thread and the
> answer give by you:
>
> ----------------- quoting begin from here -------------------
Yes. “su” expects, that in its file descriptor table entry #0
there is a reference into the system-wide open-files table, which
denotes a terminal, opened for reading. When “su” reads the
password, it calls the system service “read()” (see the manual
page “read(2)”) with the file descriptor #0 as a parameter.

> (in kernel, the standard input is always #0).

By convention, processes (except daemon processes) expect the file
descriptor #0 be opened for reading. Therefore, the file
descriptor #0 is called standard input. It's merely a naming
convention. There is nothing special with the file descriptor #0.

> So, the su cann't using #0 for reading the here-doc from
> standard input at the same time.

Yes. Each file descriptor denotes one stream of data.

> When using the here-doc to input some stuff to to su, considering that
> the #0 is preserved to used to su for reading the password from standard
> input, as a result, the kernel must pick up a FD greater than 2 for this
> purpose.
>
> Am I right?

I'm not sure, if I understand you correctly.

“su” tests, whether the file descriptor #0 is opened (at least)
for reading and associated with a terminal. If that is not the
case (for example, a here-document), “su” complains and exits.
Try the command

“su -- root <<\EOF
EOF


> As far as I understand one can't tell a shell to redirect file
> descriptor #0 to file descriptor #3 and then read commands from
> standard input.
>
> This is because we cann't use the same file descriptor to do different
> things at the same time, i.e., reading the password from stdin and
> reading the here-doc from stin meanwhile.
>
> Am I right?

What I wanted to say, is: One can't tell a running shell to
change its command source by letting it redirect the file
descriptor #0. But I'm not sure about that.

> But one can tell a shell to redirect descriptor #0 to file
> descriptor #3 and then start a new shell.
>
> By this method, we will let the original su read the password from the
> #0, while the new started shell will be sub-shell and it will be
> allocated a new #0 which is different from the original su's #0.

Yes.

>
> So, we can redirect the new shell's descriptor #0 to the file
> descriptor #3.
>
> Am I right?

Yes.

Hongyi Zhao

unread,
Jun 25, 2017, 8:54:14 PM6/25/17
to
On Mon, 26 Jun 2017 01:53:42 +0200, Helmut Waitzmann wrote:

>> When using the here-doc to input some stuff to to su, considering that
>> the #0 is preserved to used to su for reading the password from
>> standard input, as a result, the kernel must pick up a FD greater than
>> 2 for this purpose.
>>
>> Am I right?
>
> I'm not sure, if I understand you correctly.
>
> “su” tests, whether the file descriptor #0 is opened (at least)
> for reading and associated with a terminal.

How to test a FD is opened and associated with a terminal instead of
associating with a pipe / socket / file, etc?

> If that is not the case
> (for example, a here-document), “su” complains and exits. Try the
> command
>
> “su -- root <<\EOF
> EOF ”

$ su -- root <<\EOF
ls
> EOF
su: must be run from a terminal
$

According to my understanding now, this is because the #0 is opened for
reading the here-doc, and as a result, the su cann't bind it with a
terminal.

Please correct me if I'm wrong ;-)

Thanks a lot again.

Helmut Waitzmann

unread,
Jun 27, 2017, 1:05:52 AM6/27/17
to
Hongyi Zhao <hongy...@gmail.com>:
> On Mon, 26 Jun 2017 01:53:42 +0200, Helmut Waitzmann wrote:
>
>>> When using the here-doc to input some stuff to to su, considering that
>>> the #0 is preserved to used to su for reading the password from
>>> standard input, as a result, the kernel must pick up a FD greater than
>>> 2 for this purpose.
>>>
>>> Am I right?
>>
>> I'm not sure, if I understand you correctly.
>>
>> “su” tests, whether the file descriptor #0 is opened (at least)
>> for reading and associated with a terminal.
>
> How to test a FD is opened and associated with a terminal instead of
> associating with a pipe / socket / file, etc?

The system library function “isatty()” does that.

>> If that is not the case
>> (for example, a here-document), “su” complains and exits. Try the
>> command
>>
>> “su -- root <<\EOF
>> EOF ”
>
> $ su -- root <<\EOF
> ls
>> EOF
> su: must be run from a terminal
> $
>
> According to my understanding now, this is because the #0 is opened for
> reading the here-doc,

Yes. But to be precise: A process can't open a file descriptor,
a process can open files.

For opening files, the kernel maintains two data structures: a
system-wide table of opened files, and a per-process table of file
descriptors. When a process asks the kernel to open a file, the
kernel picks an unused entry of the process' table of file
descriptors.

Then it picks an unused entry of the system-wide table of open
files and records the number of that entry in the allocated entry
of the process' table of file descriptors.

In the allocated entry of the system-wide table of open files, the
kernel records, which file is to be accessed, the access mode
(that is, whether the file is opened for reading or for writing,
if writing will overwrite the file or append to it, etc.), the
current access position in the opened file, and, how many file
descriptors are associated with this entry of the system-wide
table of open files (in this case: 1).

Finally, the kernel returns the index of the allocated entry of
the process' file descriptor table, a small non-negative number,
to the process. For example, the return value of the system call
“open()” will return such a number. See the manual page “open(2)”.

Note: The process can't (directly) tell the kernel, which entry
of the file descriptors table to use, when opening a file.

But there is a system service, which allows a process to tell the
kernel, which entry of the file descriptors table to use:
“dup2()”. See the manual page “dup2(2)”.

> and as a result, the su cann't bind it with a terminal.

“su” could do (but does not; “sudo” by default does) open
“/dev/tty"”. Then there would be no need to read the password
From the opened file associated with file descriptor #0.

Kaz Kylheku

unread,
Jun 27, 2017, 10:12:08 AM6/27/17
to
On 2017-06-27, Helmut Waitzmann <nn.th...@xoxy.net> wrote:
> Hongyi Zhao <hongy...@gmail.com>:
>> How to test a FD is opened and associated with a terminal instead of
>> associating with a pipe / socket / file, etc?
>
> The system library function “isatty()” does that.

How is that useful in comp.unix.shell?

In shell programming, the POSIX-standard test operator -t does that.

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html

-t file_descriptor
True if file descriptor number file_descriptor is open and is
associated with a terminal. False if file_descriptor is not a valid
file descriptor number, or if file descriptor number file_descriptor
is not open, or if it is open but is not associated with a terminal.

Basically a wrapper for isatty.

Barry Margolin

unread,
Jun 27, 2017, 10:50:55 AM6/27/17
to
In article <201706270...@kylheku.com>,
Kaz Kylheku <686-67...@kylheku.com> wrote:

> On 2017-06-27, Helmut Waitzmann <nn.th...@xoxy.net> wrote:
> > Hongyi Zhao <hongy...@gmail.com>:
> >> How to test a FD is opened and associated with a terminal instead of
> >> associating with a pipe / socket / file, etc?
> >
> > The system library function “isatty()” does that.
>
> How is that useful in comp.unix.shell?

The question was in response to a statement that "su" does this test, so
I think he was asking how it does it, not how he would do it in the
shell.

--
Barry Margolin, bar...@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***

Hongyi Zhao

unread,
Aug 2, 2017, 7:34:00 PM8/2/17
to
On Fri, 17 Mar 2017 09:38:37 +0100, Helmut Waitzmann wrote:

> The command
>
> su -- - root -c 'exec 0<&3 3<&- && "$SHELL" ${1+"$@"}' -su \
> -s 3<<EOF
>
> would roughly correspond to the command
>
> sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh \
> -s <<\EOF

I tried all of the following forms, they all give the same results:

[1] Your original form given above:

$ sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh -s <<\EOF
echo $HOME $USER
echo $PATH
EOF
/root root
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin


[2] Without using the “-s” option:

$ sudo -u root -i sh -c 'exec "$SHELL" ${1+"$@"}' sh <<\EOFecho $HOME
$USER
echo $PATH
EOF
/root root
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

[3] Furthermore, without using “sh -c 'exec "$SHELL" ${1+"$@"}'”:

$ sudo -u root -i sh <<\EOF
echo $HOME $USER
echo $PATH
EOF
/root root
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

[4] Furthermore, without using “-u root -i”:

$ sudo sh <<\EOF
echo $HOME $USER
echo $PATH
EOF
/root root
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

As you can see, all of the above forms on my Debian stretch box will give
the same results when I test on these basic and import variables.

So, it should be equivalent when I give the same heredoc for running
commands using any of the above forms.

If so, what's the differences among them?
It is loading more messages.
0 new messages