[Tutor] Re: recursive memory

Christopher Smith csmith@blakeschool.org
Tue, 16 Apr 2002 08:56:08 -0500


This is a multi-part message in MIME format.

----=_--0094bd9f.0094bc9b.b8e197a8
Content-type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

Jack.Jansen@cwi.nl writes:
>
>On Monday, April 15, 2002, at 11:41 , Christopher Smith wrote:
>
>> I'm making a modification to the walk() function on the Mac so it avoids
>> getting caught in an alias loop between folders (i.e. walking a folder
>> which has an alias to another folder which has an alias of the first
>> folder).  The way I do this is store the file specs in a dictionary.  I
>> have two questions.
>
>macpath.walk() (or actually os.path.walk) is explicitly define *not* to 
>do special things for symlinks or aliases. But still: the functionality 
>is nice, so maybe we should put it in a new function macostools.walk.

By "special things" you don't mean that walk() is suppose to skip over
aliases, do you?  Because as it is right now, aliases are walked.  And if
they are walked they can lead to two problems:

1) an infinite loop between two folders
2) bad pathnames being passed to the walkfunc (which is the issue that
resolve() was written to address).

If these undesirable behaviors were deemed bugs then the macpath.walk()
function could just be modified.  I have attached a version which has the
same behavior as the original but now has 3 optional arguments to handle
walking aliases, other volumes, and a dictionary to prevent walking
previously walked folders.

Also, I made the modification to islink() so it would return a 1 if a file
is an alias and 0 if it is not (or if it can't be resolved, perhaps
because someone else's walk gave it a path with multiple aliases in it, in
which case the resolve function that you have could be used by that person
to demangle the path first).

/c


----=_--0094bd9f.0094bc9b.b8e197a8
Content-Type: multipart/appledouble; boundary="--=_--b8e197a9.0d740840.0000008b";
 x-mac-type="54455854"; x-mac-creator="50797468"
Content-Disposition: attachment; filename="macpath_new.py"

----=_--b8e197a9.0d740840.0000008b
Content-Type: application/applefile; name="macpath_new.py"
Content-Transfer-Encoding: base64

AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAADAAAASgAAAA4AAAAIAAAAWAAA
ABAAAAAJAAAAaAAAACAAAAACAAAAiAAAAhxtYWNwYXRoX25ldy5weQROnwUETqHP
CAAAAAgAAABURVhUUHl0aAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAHa
AAAA2gAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAADWe3MLAAAAcnVuX2FzX21haW5pAQAAAHMJAAAAc2VsZWN0aW9u
KAIAAABpxyEAAGnHIQAAcwcAAAB0YWJzaXplKAIAAABpCAAAAGkBAAAAcwwAAAB3
aW5kb3dib3VuZHMoBAAAAGkJAAAAaSsAAABpNwIAAGlOAgAAcwwAAABmb250c2V0
dGluZ3MoBAAAAHMGAAAAR2VuZXZhaQAAAABpCgAAACgDAAAAaQAAAABpAAAAAGkA
AAAAcxQAAABydW5fd2l0aF9pbnRlcnByZXRlcmkAAAAAMAAAAQAAAAHaAAAA2gAA
AEJTT1JUBbIAgAAcADIAAFB5V1MAAAAKAIAAAAAAAAAKRgGwD3dpbmRvdyBzZXR0
aW5ncw==

----=_--b8e197a9.0d740840.0000008b
Content-Type: text/plain; name="macpath_new.py"
Content-Transfer-Encoding: base64

IiIiUGF0aG5hbWUgYW5kIHBhdGgtcmVsYXRlZCBvcGVyYXRpb25zIGZvciB0aGUg
TWFjaW50b3NoLiIiIg0NaW1wb3J0IG9zDWZyb20gc3RhdCBpbXBvcnQgKg1pbXBv
cnQgbWFjZnMgI2Nwcw0NX19hbGxfXyA9IFsibm9ybWNhc2UiLCJpc2FicyIsImpv
aW4iLCJzcGxpdGRyaXZlIiwic3BsaXQiLCJzcGxpdGV4dCIsDSAgICAgICAgICAg
ImJhc2VuYW1lIiwiZGlybmFtZSIsImNvbW1vbnByZWZpeCIsImdldHNpemUiLCJn
ZXRtdGltZSIsDSAgICAgICAgICAgImdldGF0aW1lIiwiaXNsaW5rIiwiZXhpc3Rz
IiwiaXNkaXIiLCJpc2ZpbGUiLA0gICAgICAgICAgICJ3YWxrIiwiZXhwYW5kdXNl
ciIsImV4cGFuZHZhcnMiLCJub3JtcGF0aCIsImFic3BhdGgiXQ0NIyBOb3JtYWxp
emUgdGhlIGNhc2Ugb2YgYSBwYXRobmFtZS4gIER1bW15IGluIFBvc2l4LCBidXQg
PHM+Lmxvd2VyKCkgaGVyZS4NDWRlZiBub3JtY2FzZShwYXRoKToNICAgIHJldHVy
biBwYXRoLmxvd2VyKCkNDQ1kZWYgaXNhYnMocyk6DSAgICAiIiJSZXR1cm4gdHJ1
ZSBpZiBhIHBhdGggaXMgYWJzb2x1dGUuDSAgICBPbiB0aGUgTWFjLCByZWxhdGl2
ZSBwYXRocyBiZWdpbiB3aXRoIGEgY29sb24sDSAgICBidXQgYXMgYSBzcGVjaWFs
IGNhc2UsIHBhdGhzIHdpdGggbm8gY29sb25zIGF0IGFsbCBhcmUgYWxzbyByZWxh
dGl2ZS4NICAgIEFueXRoaW5nIGVsc2UgaXMgYWJzb2x1dGUgKHRoZSBzdHJpbmcg
dXAgdG8gdGhlIGZpcnN0IGNvbG9uIGlzIHRoZQ0gICAgdm9sdW1lIG5hbWUpLiIi
Ig0NICAgIHJldHVybiAnOicgaW4gcyBhbmQgc1swXSAhPSAnOicNDQ1kZWYgam9p
bihzLCAqcCk6DSAgICBwYXRoID0gcw0gICAgZm9yIHQgaW4gcDoNICAgICAgICBp
ZiAobm90IHMpIG9yIGlzYWJzKHQpOg0gICAgICAgICAgICBwYXRoID0gdA0gICAg
ICAgICAgICBjb250aW51ZQ0gICAgICAgIGlmIHRbOjFdID09ICc6JzoNICAgICAg
ICAgICAgdCA9IHRbMTpdDSAgICAgICAgaWYgJzonIG5vdCBpbiBwYXRoOg0gICAg
ICAgICAgICBwYXRoID0gJzonICsgcGF0aA0gICAgICAgIGlmIHBhdGhbLTE6XSAh
PSAnOic6DSAgICAgICAgICAgIHBhdGggPSBwYXRoICsgJzonDSAgICAgICAgcGF0
aCA9IHBhdGggKyB0DSAgICByZXR1cm4gcGF0aA0NDWRlZiBzcGxpdChzKToNICAg
ICIiIlNwbGl0IGEgcGF0aG5hbWUgaW50byB0d28gcGFydHM6IHRoZSBkaXJlY3Rv
cnkgbGVhZGluZyB1cCB0byB0aGUgZmluYWwNICAgIGJpdCwgYW5kIHRoZSBiYXNl
bmFtZSAodGhlIGZpbGVuYW1lLCB3aXRob3V0IGNvbG9ucywgaW4gdGhhdCBkaXJl
Y3RvcnkpLg0gICAgVGhlIHJlc3VsdCAocywgdCkgaXMgc3VjaCB0aGF0IGpvaW4o
cywgdCkgeWllbGRzIHRoZSBvcmlnaW5hbCBhcmd1bWVudC4iIiINDSAgICBpZiAn
Oicgbm90IGluIHM6IHJldHVybiAnJywgcw0gICAgY29sb24gPSAwDSAgICBmb3Ig
aSBpbiByYW5nZShsZW4ocykpOg0gICAgICAgIGlmIHNbaV0gPT0gJzonOiBjb2xv
biA9IGkgKyAxDSAgICBwYXRoLCBmaWxlID0gc1s6Y29sb24tMV0sIHNbY29sb246
XQ0gICAgaWYgcGF0aCBhbmQgbm90ICc6JyBpbiBwYXRoOg0gICAgICAgIHBhdGgg
PSBwYXRoICsgJzonDSAgICByZXR1cm4gcGF0aCwgZmlsZQ0NDWRlZiBzcGxpdGV4
dChwKToNICAgICIiIlNwbGl0IGEgcGF0aCBpbnRvIHJvb3QgYW5kIGV4dGVuc2lv
bi4NICAgIFRoZSBleHRlbnNpb24gaXMgZXZlcnl0aGluZyBzdGFydGluZyBhdCB0
aGUgbGFzdCBkb3QgaW4gdGhlIGxhc3QNICAgIHBhdGhuYW1lIGNvbXBvbmVudDsg
dGhlIHJvb3QgaXMgZXZlcnl0aGluZyBiZWZvcmUgdGhhdC4NICAgIEl0IGlzIGFs
d2F5cyB0cnVlIHRoYXQgcm9vdCArIGV4dCA9PSBwLiIiIg0NICAgIHJvb3QsIGV4
dCA9ICcnLCAnJw0gICAgZm9yIGMgaW4gcDoNICAgICAgICBpZiBjID09ICc6JzoN
ICAgICAgICAgICAgcm9vdCwgZXh0ID0gcm9vdCArIGV4dCArIGMsICcnDSAgICAg
ICAgZWxpZiBjID09ICcuJzoNICAgICAgICAgICAgaWYgZXh0Og0gICAgICAgICAg
ICAgICAgcm9vdCwgZXh0ID0gcm9vdCArIGV4dCwgYw0gICAgICAgICAgICBlbHNl
Og0gICAgICAgICAgICAgICAgZXh0ID0gYw0gICAgICAgIGVsaWYgZXh0Og0gICAg
ICAgICAgICBleHQgPSBleHQgKyBjDSAgICAgICAgZWxzZToNICAgICAgICAgICAg
cm9vdCA9IHJvb3QgKyBjDSAgICByZXR1cm4gcm9vdCwgZXh0DQ0NZGVmIHNwbGl0
ZHJpdmUocCk6DSAgICAiIiJTcGxpdCBhIHBhdGhuYW1lIGludG8gYSBkcml2ZSBz
cGVjaWZpY2F0aW9uIGFuZCB0aGUgcmVzdCBvZiB0aGUNICAgIHBhdGguICBVc2Vm
dWwgb24gRE9TL1dpbmRvd3MvTlQ7IG9uIHRoZSBNYWMsIHRoZSBkcml2ZSBpcyBh
bHdheXMNICAgIGVtcHR5IChkb24ndCB1c2UgdGhlIHZvbHVtZSBuYW1lIC0tIGl0
IGRvZXNuJ3QgaGF2ZSB0aGUgc2FtZQ0gICAgc3ludGFjdGljIGFuZCBzZW1hbnRp
YyBvZGRpdGllcyBhcyBET1MgZHJpdmUgbGV0dGVycywgc3VjaCBhcyB0aGVyZQ0g
ICAgYmVpbmcgYSBzZXBhcmF0ZSBjdXJyZW50IGRpcmVjdG9yeSBwZXIgZHJpdmUp
LiIiIg0NICAgIHJldHVybiAnJywgcA0NDSMgU2hvcnQgaW50ZXJmYWNlcyB0byBz
cGxpdCgpDQ1kZWYgZGlybmFtZShzKTogcmV0dXJuIHNwbGl0KHMpWzBdDWRlZiBi
YXNlbmFtZShzKTogcmV0dXJuIHNwbGl0KHMpWzFdDQ0NDWRlZiBpc2RpcihzKToN
ICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBwYXRobmFtZSByZWZlcnMgdG8gYW4g
ZXhpc3RpbmcgZGlyZWN0b3J5LiIiIg0NICAgIHRyeToNICAgICAgICBzdCA9IG9z
LnN0YXQocykNICAgIGV4Y2VwdCBvcy5lcnJvcjoNICAgICAgICByZXR1cm4gMA0g
ICAgcmV0dXJuIFNfSVNESVIoc3RbU1RfTU9ERV0pDQ0NIyBHZXQgc2l6ZSwgbXRp
bWUsIGF0aW1lIG9mIGZpbGVzLg0NZGVmIGdldHNpemUoZmlsZW5hbWUpOg0gICAg
IiIiUmV0dXJuIHRoZSBzaXplIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3Rh
dCgpLiIiIg0gICAgc3QgPSBvcy5zdGF0KGZpbGVuYW1lKQ0gICAgcmV0dXJuIHN0
W1NUX1NJWkVdDQ1kZWYgZ2V0bXRpbWUoZmlsZW5hbWUpOg0gICAgIiIiUmV0dXJu
IHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQg
Ynkgb3Muc3RhdCgpLiIiIg0gICAgc3QgPSBvcy5zdGF0KGZpbGVuYW1lKQ0gICAg
cmV0dXJuIHN0W1NUX01USU1FXQ0NZGVmIGdldGF0aW1lKGZpbGVuYW1lKToNICAg
ICIiIlJldHVybiB0aGUgbGFzdCBhY2Nlc3MgdGltZSBvZiBhIGZpbGUsIHJlcG9y
dGVkIGJ5IG9zLnN0YXQoKS4iIiINICAgIHN0ID0gb3Muc3RhdChmaWxlbmFtZSkN
ICAgIHJldHVybiBzdFtTVF9BVElNRV0NDWRlZiBpc2xpbmsocyk6DSAgICAiIiJS
ZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0aG5hbWUgcmVmZXJzIHRvIGEgc3ltYm9saWMg
bGluay4NICAgIEFsd2F5cyBmYWxzZSBvbiB0aGUgTWFjLCB1bnRpbCB3ZSB1bmRl
cnN0YW5kIEFsaWFzZXMuKSIiIg0NICAgIHRyeToNICAgICAgICByZXR1cm4gbWFj
ZnMuUmVzb2x2ZUFsaWFzRmlsZShzKVsyXSAjdXNlIHRvIGJlIDAgYWxsIHRoZSB0
aW1lDSAgICBleGNlcHQ6DSAgICAgICAgcmV0dXJuIDANDWRlZiBpc2ZpbGUocyk6
DSAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0aG5hbWUgcmVmZXJzIHRvIGFu
IGV4aXN0aW5nIHJlZ3VsYXIgZmlsZS4iIiINDSAgICB0cnk6DSAgICAgICAgc3Qg
PSBvcy5zdGF0KHMpDSAgICBleGNlcHQgb3MuZXJyb3I6DSAgICAgICAgcmV0dXJu
IDANICAgIHJldHVybiBTX0lTUkVHKHN0W1NUX01PREVdKQ0NDWRlZiBleGlzdHMo
cyk6DSAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0aG5hbWUgcmVmZXJzIHRv
IGFuIGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LiIiIg0NICAgIHRyeToNICAg
ICAgICBzdCA9IG9zLnN0YXQocykNICAgIGV4Y2VwdCBvcy5lcnJvcjoNICAgICAg
ICByZXR1cm4gMA0gICAgcmV0dXJuIDENDSMgUmV0dXJuIHRoZSBsb25nZXN0IHBy
ZWZpeCBvZiBhbGwgbGlzdCBlbGVtZW50cy4NDWRlZiBjb21tb25wcmVmaXgobSk6
DSAgICAiR2l2ZW4gYSBsaXN0IG9mIHBhdGhuYW1lcywgcmV0dXJucyB0aGUgbG9u
Z2VzdCBjb21tb24gbGVhZGluZyBjb21wb25lbnQiDSAgICBpZiBub3QgbTogcmV0
dXJuICcnDSAgICBwcmVmaXggPSBtWzBdDSAgICBmb3IgaXRlbSBpbiBtOg0gICAg
ICAgIGZvciBpIGluIHJhbmdlKGxlbihwcmVmaXgpKToNICAgICAgICAgICAgaWYg
cHJlZml4WzppKzFdICE9IGl0ZW1bOmkrMV06DSAgICAgICAgICAgICAgICBwcmVm
aXggPSBwcmVmaXhbOmldDSAgICAgICAgICAgICAgICBpZiBpID09IDA6IHJldHVy
biAnJw0gICAgICAgICAgICAgICAgYnJlYWsNICAgIHJldHVybiBwcmVmaXgNDWRl
ZiBleHBhbmR2YXJzKHBhdGgpOg0gICAgIiIiRHVtbXkgdG8gcmV0YWluIGludGVy
ZmFjZS1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMu
IiIiDSAgICByZXR1cm4gcGF0aA0NDWRlZiBleHBhbmR1c2VyKHBhdGgpOg0gICAg
IiIiRHVtbXkgdG8gcmV0YWluIGludGVyZmFjZS1jb21wYXRpYmlsaXR5IHdpdGgg
b3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuIiIiDSAgICByZXR1cm4gcGF0aA0Nbm9y
bV9lcnJvciA9ICdtYWNwYXRoLm5vcm1fZXJyb3I6IHBhdGggY2Fubm90IGJlIG5v
cm1hbGl6ZWQnDQ1kZWYgbm9ybXBhdGgocyk6DSAgICAiIiJOb3JtYWxpemUgYSBw
YXRobmFtZS4gIFdpbGwgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3INICAgIGVx
dWl2YWxlbnQgcGF0aHMuIiIiDQ0gICAgaWYgIjoiIG5vdCBpbiBzOg0gICAgICAg
IHJldHVybiAiOiIrcw0NICAgIGNvbXBzID0gcy5zcGxpdCgiOiIpDSAgICBpID0g
MQ0gICAgd2hpbGUgaSA8IGxlbihjb21wcyktMToNICAgICAgICBpZiBjb21wc1tp
XSA9PSAiIiBhbmQgY29tcHNbaS0xXSAhPSAiIjoNICAgICAgICAgICAgaWYgaSA+
IDE6DSAgICAgICAgICAgICAgICBkZWwgY29tcHNbaS0xOmkrMV0NICAgICAgICAg
ICAgICAgIGkgPSBpIC0gMQ0gICAgICAgICAgICBlbHNlOg0gICAgICAgICAgICAg
ICAgIyBiZXN0IHdheSB0byBoYW5kbGUgdGhpcyBpcyB0byByYWlzZSBhbiBleGNl
cHRpb24NICAgICAgICAgICAgICAgIHJhaXNlIG5vcm1fZXJyb3IsICdDYW5ub3Qg
dXNlIDo6IGltbWVkaWF0ZWx5IGFmdGVyIHZvbHVtZSBuYW1lJw0gICAgICAgIGVs
c2U6DSAgICAgICAgICAgIGkgPSBpICsgMQ0NICAgIHMgPSAiOiIuam9pbihjb21w
cykNDSAgICAjIHJlbW92ZSB0cmFpbGluZyAiOiIgZXhjZXB0IGZvciAiOiIgYW5k
ICJWb2x1bWU6Ig0gICAgaWYgc1stMV0gPT0gIjoiIGFuZCBsZW4oY29tcHMpID4g
MiBhbmQgcyAhPSAiOiIqbGVuKHMpOg0gICAgICAgIHMgPSBzWzotMV0NICAgIHJl
dHVybiBzDQ0NZGVmIHdhbGsodG9wLCBmdW5jLCBhcmcsd2Fsa0FsaWFzPTEsd2Fs
a090aGVyVm9sdW1lcz0xLHdhbGtlZD17fSk6DSAgICAiIiJEaXJlY3RvcnkgdHJl
ZSB3YWxrIHdpdGggY2FsbGJhY2sgZnVuY3Rpb24uDQ0gICAgRm9yIGVhY2ggZGly
ZWN0b3J5IGluIHRoZSBkaXJlY3RvcnkgdHJlZSByb290ZWQgYXQgdG9wIChpbmNs
dWRpbmcgdG9wDSAgICBpdHNlbGYsIGJ1dCBleGNsdWRpbmcgJy4nIGFuZCAnLi4n
KSwgY2FsbCBmdW5jKGFyZywgZGlybmFtZSwgZm5hbWVzKS4NICAgIGRpcm5hbWUg
aXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSwgYW5kIGZuYW1lcyBhIGxpc3Qg
b2YgdGhlIG5hbWVzIG9mDSAgICB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVz
IGluIGRpcm5hbWUgKGV4Y2x1ZGluZyAnLicgYW5kICcuLicpLiAgZnVuYw0gICAg
bWF5IG1vZGlmeSB0aGUgZm5hbWVzIGxpc3QgaW4tcGxhY2UgKGUuZy4gdmlhIGRl
bCBvciBzbGljZSBhc3NpZ25tZW50KSwNICAgIGFuZCB3YWxrIHdpbGwgb25seSBy
ZWN1cnNlIGludG8gdGhlIHN1YmRpcmVjdG9yaWVzIHdob3NlIG5hbWVzIHJlbWFp
biBpbg0gICAgZm5hbWVzOyB0aGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBh
IGZpbHRlciwgb3IgdG8gaW1wb3NlIGEgc3BlY2lmaWMNICAgIG9yZGVyIG9mIHZp
c2l0aW5nLiAgTm8gc2VtYW50aWNzIGFyZSBkZWZpbmVkIGZvciwgb3IgcmVxdWly
ZWQgb2YsIGFyZywNICAgIGJleW9uZCB0aGF0IGFyZyBpcyBhbHdheXMgcGFzc2Vk
IHRvIGZ1bmMuICBJdCBjYW4gYmUgdXNlZCwgZS5nLiwgdG8gcGFzcw0gICAgYSBm
aWxlbmFtZSBwYXR0ZXJuLCBvciBhIG11dGFibGUgb2JqZWN0IGRlc2lnbmVkIHRv
IGFjY3VtdWxhdGUNICAgIHN0YXRpc3RpY3MuICBQYXNzaW5nIE5vbmUgZm9yIGFy
ZyBpcyBjb21tb24uDQ0gICAgaWYgd2Fsa0FsaWFzIGlzIDAsIG5vIGFsaWFzIGZv
bGRlcnMgd2lsbCBiZSBmb2xsb3dlZDsgZnVydGhlcm1vcmUsDSAgICBpZiB3YWxr
T3RoZXJWb2x1bWVzIGlzIDAgdGhlbiBvbmx5IGZvbGRlcnMgb24gdGhlIHNhbWUg
dm9sdW1lDSAgICBhcyB0aGUgaW5pdGlhbCBvbmUgd2lsbCBiZSB3YWxrZWQuICBU
aGUgZGljdGlvbmFyeSAid2Fsa2VkIiBpcyB1c2VkDSAgICB0byBrZWVwIHRyYWNr
IG9mIHRoZSBmc3MncyB0aGF0IGhhdmUgYmVlbiB3YWxrZWQgYWxyZWFkeSB0byBh
dm9pZCB3YWxraW5nDSAgICB0aHJvdWdoIGEgZm9sZGVyIHRoYXQgaGFzIGFscmVh
ZHkgYmVlbiB3YWxrZWQuDQ0gICAgQ2F1dGlvbjogIGlzIHlvdSB3YWxrIGFsaWFz
ZXMgYW5kIHlvdSBlbmNvdW50ZXIgYW4gYWxpYXMgdG8gYW4gdW5tb3VudGVkDSAg
ICB2b2x1bWUsIHlvdSB3aWxsIGJlIGFza2VkIHRvIG1vdW50IHRoZSB2b2x1bWUg
KGUuZyBpbnNlcnQgdGhlIG1pc3NpbmcgZGlzaykNICAgIHdoZXRoZXIgb3Igbm90
IHlvdSB3YW50IHRvIHdhbGsgb3RoZXIgdm9sdW1lcy4gIEkgZG9uJ3Qga25vdyBo
b3cgdG8gZGV0ZWN0DSAgICB0aGlzIGNvbmRpdGlvbiBiZWZvcmUgdGhlIHJlcXVl
c3QgdG8gaW5zZXJ0IHRoZSBkaXNrIGlzIG1hZGUuICBSaWdodCBub3cgdGhlIA0g
ICAgd2Fsa090aGVyVm9sdW1lcyBvcHRpb24gd2lsbCBhbGxvdyB5b3UgdG8ga2Vl
cCB5b3VyIHdhbGsgdG8gYSBzaW5nbGUgdm9sdW1lLiIiIg0NICAgIHRyeToNICAg
ICAgICBuYW1lcyA9IG9zLmxpc3RkaXIodG9wKQ0gICAgZXhjZXB0IG9zLmVycm9y
Og0gICAgICAgIHJldHVybg0gICAgZnVuYyhhcmcsIHRvcCwgbmFtZXMpDQ0jIGlu
aXRpYWxpemUgdGhlIHdhbGsgcmVjb3JkDSAgICBpZiB3YWxrQWxpYXM6DSAgICAg
ICAgZnNzLCBpc0RpciwgaXNBbGlhcz1tYWNmcy5SZXNvbHZlQWxpYXNGaWxlKHRv
cCkNICAgICAgICBrPWZzcy5hc190dXBsZSgpDSAgICAgICAgd2Fsa2VkW2tdPScn
DSAgICAgICAgaWYgbm90IHdhbGtlZC5oYXNfa2V5KCd0b3Bfdm9sdW1lJyk6DSAg
ICAgICAgICAgIHdhbGtlZFsndG9wX3ZvbHVtZSddPWtbMF0NDSMgd2FsayB0aGUg
c3ViLWl0ZW1zIGluIHRoaXMgZGlyZWN0b3J5IGlmIHRoZXkgYXJlIGRpcmVjdG9y
aWVzDSAgICBmb3IgbmFtZSBpbiBuYW1lczoNICAgICAgICBuYW1lID0gam9pbih0
b3AsIG5hbWUpDQ0gICAgICAgIHRyeTogCQkJCSNnZXQgdGhlIGluZm9ybWF0aW9u
IGFib3V0IHRoaXMgbmFtZQ0gICAgICAgICAgICBmc3MsIGlzRGlyLCBpc0FsaWFz
PW1hY2ZzLlJlc29sdmVBbGlhc0ZpbGUobmFtZSkNICAgICAgICBleGNlcHQ6DSAg
ICAgICAgICAgIGNvbnRpbnVlIAkJI2RpcmVjdG9yeSBkb2Vzbid0IGV4aXN0DQ0g
ICAgICAgIGlmIGlzRGlyOg0gICAgICAgICAgICBpZiBpc0FsaWFzIGFuZCBub3Qg
d2Fsa0FsaWFzOiBjb250aW51ZQ0gICAgICAgICAgICBpZiB3YWxrQWxpYXM6DSAg
ICAgICAgICAgICAgICBrPWZzcy5hc190dXBsZSgpDSAgICAgICAgICAgICAgICBp
ZiAobm90IHdhbGtPdGhlclZvbHVtZXMgYW5kIHdhbGtlZFsndG9wX3ZvbHVtZSdd
PD5rWzBdKSBvciB3YWxrZWQuaGFzX2tleShrKTogY29udGludWUgDSAgICAgICAg
ICAgICAgICB3YWxrZWRba109JycNICAgICAgICAgICAgICAgIGlmIGlzQWxpYXM6
CQkjcmVzb2x2ZSBub3cgb3IgZWxzZSBpdCB3b24ndCBiZSBlYXN5IGxhdGVyDSAg
ICAgICAgICAgICAgICAgICAgbmFtZT1mc3MuYXNfcGF0aG5hbWUoKQ0JICAgIHdh
bGsobmFtZSwgZnVuYywgYXJnLCB3YWxrQWxpYXMsIHdhbGtPdGhlclZvbHVtZXMs
IHdhbGtlZCkNDQ0NZGVmIGFic3BhdGgocGF0aCk6DSAgICAiIiJSZXR1cm4gYW4g
YWJzb2x1dGUgcGF0aC4iIiINICAgIGlmIG5vdCBpc2FicyhwYXRoKToNICAgICAg
ICBwYXRoID0gam9pbihvcy5nZXRjd2QoKSwgcGF0aCkNICAgIHJldHVybiBub3Jt
cGF0aChwYXRoKQ0NIyByZWFscGF0aCBpcyBhIG5vLW9wIG9uIHN5c3RlbXMgd2l0
aG91dCBpc2xpbmsgc3VwcG9ydA1yZWFscGF0aCA9IGFic3BhdGgNDWlmIF9fbmFt
ZV9fID09ICdfX21haW5fXyc6DQlpbXBvcnQgdGltZQ0JZGVmIHdhbGtmdW5jKGFy
ZywgZGlyLG5hbWVzKToNCQlmb3IgbmFtZSBpbiBuYW1lczoNCQkJcz1qb2luKGRp
cixuYW1lKQ0JCQlwcmludCBuYW1lDQ0JdG9wPW1hY2ZzLkdldERpcmVjdG9yeSgp
WzBdLmFzX3BhdGhuYW1lKCkNCXQ9dGltZS50aW1lKCkNCXByaW50DQlhcmc9W10N
CXdhbGtBbGlhc2VzPTANCXdhbGtPdGhlclZvbHVtZXM9MA0Jd2Fsayh0b3Asd2Fs
a2Z1bmMsYXJnLHdhbGtBbGlhc2VzLHdhbGtPdGhlclZvbHVtZXMpDQlwcmludCAi
U2Vjb25kcyB0YWtlbjoiLHRpbWUudGltZSgpLXQN

----=_--b8e197a9.0d740840.0000008b--

----=_--0094bd9f.0094bc9b.b8e197a8--