[Pythonmac-SIG] Automating running a sequence of programs

Francois Granger fgranger@altern.org
Wed, 18 Apr 2001 00:02:20 +0200


--============_-1224577438==_============
Content-Type: text/plain; charset="us-ascii" ; format="flowed"

At 10:52 -0700 17/04/01, in message [Pythonmac-SIG] Automating 
running a sequence of progr, Chris Barker wrote:
>Hi all,
>
>
>I need to have a way to automate a sequence of programs running,
>something along the idea of:
>
>create config file
>run program A
>run Program B (using a file created by program A)
>repeat as needed
>
>I've tried using findertools.launch, and it mostly works, but I get some
>long pauses, and I got an appleevent timeout errot (or something like
>that) on one test run. I think the trick here is that I need the
>programs to finish running before I run the next one. That does not
>appear to be happening. I think the programs I'm running lock up the
>system enough that it sort of works but isn't reliable.
>
>So I think my question is:
>
>How can a launch antoher program and then wait for it to finish before I
>do something else?

Have a look to "More findertools" it should be in Mac:Contrib. I 
enclose in case. It can check for processes. This may be all you need 
??

--============_-1224577438==_============
Content-Id: <v04210100b7026d697489@[213.228.25.34].0.0>
Content-Type: multipart/appledouble; boundary="============_-1224577438==_D============"

--============_-1224577438==_D============
Content-Transfer-Encoding: base64
Content-Type: application/applefile; name="%morefindertools.py"
Content-Disposition: attachment; filename="%morefindertools.py"
 ; modification-date="Tue, 10 Oct 2000 09:26:35 +0200"

AAUWBwACAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAADAAAASgAAABIAAAAJAAAAXAAAACAA
AAAIAAAAfAAAABAAAAACAAAAjAAAAgNtb3JlZmluZGVydG9vbHMucHlURVhUUGlkZQEA
AAAAAQAAAAAAAAAAAAAAAAAAAAAAAABpjzwBdZ1LS20MAAJvloIAAAEAAAABwQAAAMEA
AABCAAWSBgdqYW5pY2UyAAWZ7QdqYW5pY2UyDQAABZIGB2phbmljZTMABZn0B2phbmlj
ZTMNAAAFkgYHamFuaWNlNAAFmf0HamFuaWNlNA4AAAWSBghqZW5uaWZlci4ABZoICGpl
bm5pZmVyAAoAAAWSBgRqaWxsZQAFmhAEamlsbAAMAAAFkgYGSmlzZWxZMgAFmiMGSmlz
ZWxZAA0AAAWSBgdKb2xpbmRhAAWaLQdKb2xpbmRhCgAABZIGBGthcmFfAAWaMwRrYXJh
AAkAAAWSBgNraWEABZo4A2tpYQwAAAWSBgZrb29rb29kAAWaPAZrAAAAvXtzBwAAAHRh
YnNpemUoAgAAAGkIAAAAaQEAAABzDAAAAGZvbnRzZXR0aW5ncygEAAAAcwsAAABQeXRo
b24tU2Fuc2kAAAAAaQkAAAAoAwAAAGkAAAAAaQAAAABpAAAAAHMMAAAAd2luZG93Ym91
bmRzKAQAAABpCgEAAGlJAAAAaSAEAABpNQMAAHMLAAAAcnVuX2FzX21haW5pAAAAAHMJ
AAAAc2VsZWN0aW9uKAIAAABpywIAAGnLAgAAMAAAAQAAAAHBAAAAwQAAAEIPZq2wBGYA
AAAcADIAAFB5V1MAAAAKAIAAAAAAAAAPdgfED3dpbmRvdyBzZXR0aW5ncw==
--============_-1224577438==_D============
Content-Type: application/octet-stream; name="morefindertools.py"
Content-Disposition: attachment; filename="morefindertools.py"
Content-Transfer-Encoding: base64

IiIiVXRpbGl0eSByb3V0aW5lcyBkZXBlbmRpbmcgb24gdGhlIGZpbmRlciwNaW5zcGly
ZWQgYnkgZmluZGVydG9vbHMsIGJ1dCBleHRlbmRlZC4NTW9zdCBldmVudHMgaGF2ZSBi
ZWVuIGNhcHR1cmVkIGZyb20NTGFzc28gQ2FwdHVyZSBBRSBhbmQgdGhhbiB0cmFuc2xh
dGVkIHRvIHB5dGhvbiBjb2RlLg0NSU1QT1JUQU5UDU5vdGUgdGhhdCB0aGUgcHJvY2Vz
c2VzKCkgZnVuY3Rpb24gcmV0dXJucyBkaWZmZXJlbnQgdmFsdWVzDWRlcGVuZGluZyBv
biB0aGUgT1MgdmVyc2lvbiBpdCBpcyBydW5uaW5nIG9uLiBPbiBNYWNPUyA5DXRoZSBG
aW5kZXIgcmV0dXJucyB0aGUgcHJvY2VzcyAqbmFtZXMqIHdoaWNoIGNhbiB0aGVuIGJl
DXVzZWQgdG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGVtLiBPbiBNYWNPUyA4LjYgYW5k
IGVhcmxpZXINdGhlIEZpbmRlciByZXR1cm5zIGEgY29kZSB3aGljaCBkb2VzIG5vdCBz
ZWVtIHRvIHdvcmsuDVNvIGJvdHRvbSBsaW5lOiB0aGUgcHJvY2Vzc2VzKCkgc3R1ZmYg
ZG9lcyBub3Qgd29yayBvbiA8IE1hY09TOQ0NV3JpdHRlbiBieSBlcmlrQGxldHRlcnJv
ci5jb20NIiIiDQ1pbXBvcnQgRmluZGVyXzdfMF9TdWl0ZSwgRmluZGVyX1N1aXRlDWlt
cG9ydCBBcHBsZUV2ZW50cw1pbXBvcnQgYWV0b29scw1pbXBvcnQgTWFjT1MNaW1wb3J0
IHN5cw1pbXBvcnQgbWFjZnMNaW1wb3J0IGFldHlwZXMNZnJvbSB0eXBlcyBpbXBvcnQg
Kg0NX192ZXJzaW9uX18gPSAnMS4wJw1tb3JlZmluZGVydG9vbHNlcnJvciA9ICdtb3Jl
ZmluZGVydG9vbHMgRXJyb3InDQ0NU0lHTkFUVVJFPSdNQUNTJw0NY2xhc3MgRmluZGVy
KGFldG9vbHMuVGFsa1RvLCBGaW5kZXJfU3VpdGUuRmluZGVyX1N1aXRlLCBGaW5kZXJf
N18wX1N1aXRlLkZpbmRlcl83XzBfU3VpdGUpOg0JcGFzcw0JDV9maW5kZXJfdGFsa2Vy
ID0gTm9uZQ0NZGVmIF9nZXRmaW5kZXIoKToNCSIiInJldHVybnMgYmFzaWMgKHJlY3lj
bGFibGUpIEZpbmRlciBBRSBpbnRlcmZhY2Ugb2JqZWN0IiIiDQlnbG9iYWwgX2ZpbmRl
cl90YWxrZXINCWlmIG5vdCBfZmluZGVyX3RhbGtlcjoNCQlfZmluZGVyX3RhbGtlciA9
IEZpbmRlcihTSUdOQVRVUkUpDQlfZmluZGVyX3RhbGtlci5zZW5kX2ZsYWdzID0gKCBf
ZmluZGVyX3RhbGtlci5zZW5kX2ZsYWdzIHwgDQkJQXBwbGVFdmVudHMua0FFQ2FuSW50
ZXJhY3QgfCBBcHBsZUV2ZW50cy5rQUVDYW5Td2l0Y2hMYXllcikNCXJldHVybiBfZmlu
ZGVyX3RhbGtlcg0NDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0NIwlUaGUgb3JpZ2luYWwgZmluZGVydG9vbHMNIw0NZGVmIGxh
dW5jaChmaWxlKToNCSIiIk9wZW4gYSBmaWxlIHRocnUgdGhlIGZpbmRlci4gU3BlY2lm
eSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjIiIiDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkN
CWZzcyA9IG1hY2ZzLkZTU3BlYyhmaWxlKQ0JdlJlZk51bSwgcGFySUQsIG5hbWUgPSBm
c3MuYXNfdHVwbGUoKQ0JZGlyX2ZzcyA9IG1hY2ZzLkZTU3BlYygodlJlZk51bSwgcGFy
SUQsICcnKSkNCWZpbGVfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQ0JZGlyX2FsaWFzID0g
ZGlyX2Zzcy5OZXdBbGlhcygpDQlyZXR1cm4gZmluZGVyLm9wZW4oZGlyX2FsaWFzLCBp
dGVtcz1bZmlsZV9hbGlhc10pDQkNZGVmIFByaW50KGZpbGUpOg0JIiIiUHJpbnQgYSBm
aWxlIHRocnUgdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVj
IiIiDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkNCWZzcyA9IG1hY2ZzLkZTU3BlYyhmaWxl
KQ0JdlJlZk51bSwgcGFySUQsIG5hbWUgPSBmc3MuYXNfdHVwbGUoKQ0JZGlyX2ZzcyA9
IG1hY2ZzLkZTU3BlYygodlJlZk51bSwgcGFySUQsICcnKSkNCWZpbGVfYWxpYXMgPSBm
c3MuTmV3QWxpYXMoKQ0JZGlyX2FsaWFzID0gZGlyX2Zzcy5OZXdBbGlhcygpDQlyZXR1
cm4gZmluZGVyLl9wcmludChkaXJfYWxpYXMsIGl0ZW1zPVtmaWxlX2FsaWFzXSkNCQ1k
ZWYgY29weShzcmMsIGRzdGRpcik6DQkiIiJDb3B5IGEgZmlsZSB0byBhIGZvbGRlciIi
Ig0JZmluZGVyID0gX2dldGZpbmRlcigpDQlzcmNfZnNzID0gbWFjZnMuRlNTcGVjKHNy
YykNCWRzdF9mc3MgPSBtYWNmcy5GU1NwZWMoZHN0ZGlyKQ0Jc3JjX2FsaWFzID0gc3Jj
X2Zzcy5OZXdBbGlhcygpDQlkc3RfYWxpYXMgPSBkc3RfZnNzLk5ld0FsaWFzKCkNCXJl
dHVybiBmaW5kZXIuY29weV90byhkc3RfYWxpYXMsIF9mcm9tPVtzcmNfYWxpYXNdKQ0N
ZGVmIG1vdmUoc3JjLCBkc3RkaXIpOg0JIiIiTW92ZSBhIGZpbGUgdG8gYSBmb2xkZXIi
IiINCWZpbmRlciA9IF9nZXRmaW5kZXIoKQ0Jc3JjX2ZzcyA9IG1hY2ZzLkZTU3BlYyhz
cmMpDQlkc3RfZnNzID0gbWFjZnMuRlNTcGVjKGRzdGRpcikNCXNyY19hbGlhcyA9IHNy
Y19mc3MuTmV3QWxpYXMoKQ0JZHN0X2FsaWFzID0gZHN0X2Zzcy5OZXdBbGlhcygpDQly
ZXR1cm4gZmluZGVyLm1vdmVfdG8oZHN0X2FsaWFzLCBfZnJvbT1bc3JjX2FsaWFzXSkN
DWRlZiBzbGVlcCgpOg0JIiIiUHV0IHRoZSBtYWMgdG8gc2xlZXAiIiINCWZpbmRlciA9
IF9nZXRmaW5kZXIoKQ0JZmluZGVyLnNsZWVwKCkNCQ1kZWYgc2h1dGRvd24oKToNCSIi
IlNodXQgdGhlIG1hYyBkb3duIiIiDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkNCWZpbmRl
ci5zaHV0X2Rvd24oKQ0JDWRlZiByZXN0YXJ0KCk6DQkiIiJSZXN0YXJ0IHRoZSBtYWMi
IiINCWZpbmRlciA9IF9nZXRmaW5kZXIoKQ0JZmluZGVyLnJlc3RhcnQoKQ0NDSMtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NIwlB
ZGRpdGlvbmFsIGZpbmRlcnRvb2xzDSMNDWRlZiByZXZlYWwoZmlsZSk6DQkiIiJSZXZl
YWwgYSBmaWxlIGluIHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZz
c3BlYy4iIiINCWZpbmRlciA9IF9nZXRmaW5kZXIoKQ0JZnNzID0gbWFjZnMuRlNTcGVj
KGZpbGUpDQlmaWxlX2FsaWFzID0gZnNzLk5ld0FsaWFzKCkNCXJldHVybiBmaW5kZXIu
cmV2ZWFsKGZpbGVfYWxpYXMpDQkNZGVmIHNlbGVjdChmaWxlKToNCSIiInNlbGVjdCBh
IGZpbGUgaW4gdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVj
LiIiIg0JZmluZGVyID0gX2dldGZpbmRlcigpDQlmc3MgPSBtYWNmcy5GU1NwZWMoZmls
ZSkNCWZpbGVfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQ0JcmV0dXJuIGZpbmRlci5zZWxl
Y3QoZmlsZV9hbGlhcykNCQ1kZWYgdXBkYXRlKGZpbGUpOg0JIiIiVXBkYXRlIHRoZSBk
aXNwbGF5IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpIHRvIG1hdGNoIA0JdGhlaXIg
b24tZGlzayByZXByZXNlbnRhdGlvbi4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNz
cGVjLiIiIg0JZmluZGVyID0gX2dldGZpbmRlcigpDQlmc3MgPSBtYWNmcy5GU1NwZWMo
ZmlsZSkNCWZpbGVfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQ0JcmV0dXJuIGZpbmRlci51
cGRhdGUoZmlsZV9hbGlhcykNDQ0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tDSMJTW9yZSBmaW5kZXJ0b29scw0jDQ1kZWYgY29t
bWVudChvYmplY3QsIGNvbW1lbnQ9Tm9uZSk6DQkiIiJjb21tZW50OiBnZXQgb3Igc2V0
IHRoZSBGaW5kZXItY29tbWVudCBvZiB0aGUgaXRlbSwgZGlzcGxheWVkIGluIHRoZSDS
R2V0IEluZm/TIHdpbmRvdy4iIiINCW9iamVjdCA9IG1hY2ZzLkZTU3BlYyhvYmplY3Qp
DQlmc3MgPSBtYWNmcy5GU1NwZWMob2JqZWN0KQ0Jb2JqZWN0X2FsaWFzID0gZnNzLk5l
d0FsaWFzKCkNCWlmIGNvbW1lbnQgPT0gTm9uZToNCQlyZXR1cm4gX2dldGNvbW1lbnQo
b2JqZWN0X2FsaWFzKQ0JZWxzZToNCQlyZXR1cm4gX3NldGNvbW1lbnQob2JqZWN0X2Fs
aWFzLCBjb21tZW50KQ0JDWRlZiBfc2V0Y29tbWVudChvYmplY3RfYWxpYXMsIGNvbW1l
bnQpOg0JZmluZGVyID0gX2dldGZpbmRlcigpDQlhcmdzID0ge30NCWF0dHJzID0ge30N
CWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5
cGUoJ2NvYmonKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25l
KQ0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMu
VHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2NvbXQn
KSwgZnI9YWVvYmpfMDApDQlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQ0JYXJnc1siZGF0
YSJdID0gY29tbWVudA0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJj
b3JlIiwgInNldGQiLCBhcmdzLCBhdHRycykNCWlmIGFyZ3MuaGFzX2tleSgnZXJybicp
Og0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9y
KGFyZ3MpDQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToNCQlyZXR1cm4gYXJnc1snLS0t
LSddDQ1kZWYgX2dldGNvbW1lbnQob2JqZWN0X2FsaWFzKToNCWZpbmRlciA9IF9nZXRm
aW5kZXIoKQ0JYXJncyA9IHt9DQlhdHRycyA9IHt9DQlhZW9ial8wMCA9IGFldHlwZXMu
T2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIGZvcm09ImFs
aXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkNCWFlb2JqXzAxID0gYWV0eXBl
cy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0i
cHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjb210JyksIGZyPWFlb2JqXzAwKQ0JYXJn
c1snLS0tLSddID0gYWVvYmpfMDENCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIu
c2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpDQlpZiBhcmdzLmhhc19rZXko
J2Vycm4nKToNCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNv
ZGVlcnJvcihhcmdzKQ0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6DQkJcmV0dXJuIGFy
Z3NbJy0tLS0nXQ0NDSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0NIwlHZXQgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBwcm9j
ZXNzZXMgaW4gdGhlIEZpbmRlci4NDWRlZiBwcm9jZXNzZXMoKToNCSIiInByb2Nlc3Nl
cyByZXR1cm5zIGEgbGlzdCBvZiBhbGwgYWN0aXZlIHByb2Nlc3NlcyBydW5uaW5nIG9u
IHRoaXMgY29tcHV0ZXIgYW5kIHRoZWlyIGNyZWF0b3JzLiIiIg0JZmluZGVyID0gX2dl
dGZpbmRlcigpDQlhcmdzID0ge30NCWF0dHJzID0ge30NCXByb2Nlc3NuYW1lcyA9IFtd
DQlwcm9jZXNzbnVtYmVycyA9IFtdDQljcmVhdG9ycyA9IFtdDQlwYXJ0aXRpb25zID0g
W10NCXVzZWQgPSBbXQ0JIyMgZ2V0IHRoZSBwcm9jZXNzbmFtZXMgb3IgZWxzZSB0aGUg
cHJvY2Vzc251bWJlcnMNCWFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lm
aWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09ImluZHgiLCBzZWxkPWFl
dHlwZXMuVW5rbm93bignYWJzbycsICJhbGwgIiksIGZyPU5vbmUpDQlfcmVwbHksIGFy
Z3MsIGF0dHJzID0gZmluZGVyLnNlbmQoJ2NvcmUnLCAnZ2V0ZCcsIGFyZ3MsIGF0dHJz
KQ0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6DQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xz
ZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykNCXAgPSBbXQ0JaWYgYXJncy5o
YXNfa2V5KCctLS0tJyk6DQkJcCA9ICBhcmdzWyctLS0tJ10NCQlmb3IgcHJvYyBpbiBw
Og0JCQlpZiBoYXNhdHRyKHByb2MsICdzZWxkJyk6DQkJCQkjIGl0IGhhcyBhIHJlYWwg
bmFtZQ0JCQkJcHJvY2Vzc25hbWVzLmFwcGVuZChwcm9jLnNlbGQpDQkJCWVsaWYgaGFz
YXR0cihwcm9jLCAndHlwZScpOg0JCQkJaWYgcHJvYy50eXBlID09ICJwc24gIjoNCQkJ
CQkjIGl0IGhhcyBhIHByb2Nlc3MgbnVtYmVyDQkJCQkJcHJvY2Vzc251bWJlcnMuYXBw
ZW5kKHByb2MuZGF0YSkNCSMjIGdldCB0aGUgY3JlYXRvcnMNCWFyZ3MgPSB7fQ0JYXR0
cnMgPSB7fQ0JYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0
eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09ImluZHgiLCBzZWxkPWFldHlwZXMuVW5rbm93
bignYWJzbycsICJhbGwgIiksIGZyPU5vbmUpDQlhcmdzWyctLS0tJ10gPSAgYWV0eXBl
cy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0i
cHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdmY3J0JyksIGZyPWFlb2JqXzApDQlfcmVw
bHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoJ2NvcmUnLCAnZ2V0ZCcsIGFyZ3Ms
IGF0dHJzKQ0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6DQkJcmFpc2UgbW9yZWZpbmRl
cnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZykNCWlmIGFyZ3MuaGFz
X2tleSgnLS0tLScpOg0JCXAgPSAgYXJnc1snLS0tLSddDQkJZm9yIHByb2MgaW4gcDoN
CQkJY3JlYXRvcnMuYXBwZW5kKHByb2MudHlwZSkNCSMjIGNvbmNhdGVuYXRlIGluIG9u
ZSBkaWN0DQlyZXN1bHQgPSBbXQ0JaWYgbGVuKHByb2Nlc3NuYW1lcykgPiBsZW4ocHJv
Y2Vzc251bWJlcnMpOg0JCWRhdGEgPSBwcm9jZXNzbmFtZXMNCWVsc2U6DQkJZGF0YSA9
IHByb2Nlc3NudW1iZXJzDQlmb3IgaSBpbiByYW5nZShsZW4oY3JlYXRvcnMpKToNCQly
ZXN1bHQuYXBwZW5kKChkYXRhW2ldLCBjcmVhdG9yc1tpXSkpDQlyZXR1cm4gcmVzdWx0
DQ1jbGFzcyBfcHJvY2VzczoNCXBhc3MNDWRlZiBpc2FjdGl2ZXByb2Nlc3MocHJvY2Vz
c25hbWUpOg0JIiIiQ2hlY2sgb2YgcHJvY2Vzc25hbWUgaXMgYWN0aXZlLiBNYWNPUzki
IiINCWFsbCA9IHByb2Nlc3NlcygpDQlvayA9IDANCWZvciBuLCBjIGluIGFsbDoNCQlp
ZiBuID09IHByb2Nlc3NuYW1lOg0JCQlyZXR1cm4gMQ0JcmV0dXJuIDANCQ1kZWYgcHJv
Y2Vzc2luZm8ocHJvY2Vzc25hbWUpOg0JIiIiUmV0dXJuIGFuIG9iamVjdCB3aXRoIGFs
bCBwcm9jZXNzIHByb3BlcnRpZXMgYXMgYXR0cmlidXRlcyBmb3IgcHJvY2Vzc25hbWUu
IE1hY09TOSIiIg0JcCA9IF9wcm9jZXNzKCkNCQ0JaWYgcHJvY2Vzc25hbWUgPT0gIkZp
bmRlciI6DQkJcC5wYXJ0aXRpb24gPSBOb25lDQkJcC51c2VkID0gTm9uZQ0JZWxzZToN
CQlwLnBhcnRpdGlvbiA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdhcHB0
JykNCQlwLnVzZWQgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncHVzZCcp
DQlwLnZpc2libGUgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncHZpcycp
CQkjSXMgdGhlIHByb2Nlc3MnIGxheWVyIHZpc2libGU/DQlwLmZyb250bW9zdCA9IF9w
cm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdwaXNmJykJI0lzIHRoZSBwcm9jZXNz
IHRoZSBmcm9udG1vc3QgcHJvY2Vzcz8NCXAuZmlsZSA9IF9wcm9jZXNzcHJvcGVydHko
cHJvY2Vzc25hbWUsICdmaWxlJykJCQkjdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgcHJv
Y2VzcyB3YXMgbGF1bmNoZWQNCXAuZmlsZXR5cGUgID0gX3Byb2Nlc3Nwcm9wZXJ0eShw
cm9jZXNzbmFtZSwgJ2FzdHknKQkJI3RoZSBPU1R5cGUgb2YgdGhlIGZpbGUgdHlwZSBv
ZiB0aGUgcHJvY2Vzcw0JcC5jcmVhdG9ydHlwZSA9IF9wcm9jZXNzcHJvcGVydHkocHJv
Y2Vzc25hbWUsICdmY3J0JykJI3RoZSBPU1R5cGUgb2YgdGhlIGNyZWF0b3Igb2YgdGhl
IHByb2Nlc3MgKHRoZSBzaWduYXR1cmUpDQlwLmFjY2VwdGhpZ2hsZXZlbCA9IF9wcm9j
ZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdyZXZ0JykJI0lzIHRoZSBwcm9jZXNzIGhp
Z2gtbGV2ZWwgZXZlbnQgYXdhcmUgKGFjY2VwdHMgb3BlbiBhcHBsaWNhdGlvbiwgb3Bl
biBkb2N1bWVudCwgcHJpbnQgZG9jdW1lbnQsIGFuZCBxdWl0KT8NCXAuaGFzc2NyaXB0
aW5nID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2hzY3InKQkJI0RvZXMg
dGhlIHByb2Nlc3MgaGF2ZSBhIHNjcmlwdGluZyB0ZXJtaW5vbG9neSwgaS5lLiwgY2Fu
IGl0IGJlIHNjcmlwdGVkPw0JcmV0dXJuIHANCQ1kZWYgX3Byb2Nlc3Nwcm9wZXJ0eShw
cm9jZXNzbmFtZSwgcHJvcGVydHkpOg0JIiIicmV0dXJuIHRoZSBwYXJ0aXRpb24gc2l6
ZSBhbmQgbWVtb3J5IHVzZWQgZm9yIHByb2Nlc3NuYW1lIiIiDQlmaW5kZXIgPSBfZ2V0
ZmluZGVyKCkNCWFyZ3MgPSB7fQ0JYXR0cnMgPSB7fQ0JYWVvYmpfMDAgPSBhZXR5cGVz
Lk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJjcycpLCBmb3JtPSJu
YW1lIiwgc2VsZD1wcm9jZXNzbmFtZSwgZnI9Tm9uZSkNCWFlb2JqXzAxID0gYWV0eXBl
cy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0i
cHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKHByb3BlcnR5KSwgZnI9YWVvYmpfMDApDQlh
cmdzWyctLS0tJ10gPSBhZW9ial8wMQ0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRl
ci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykNCWlmIGFyZ3MuaGFzX2tl
eSgnZXJybicpOg0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRl
Y29kZWVycm9yKGFyZ3MpDQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToNCQlyZXR1cm4g
YXJnc1snLS0tLSddDQ0NIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQ0jCU1lc3MgYXJvdW5kIHdpdGggRmluZGVyIHdpbmRvd3Mu
DQkNZGVmIG9wZW53aW5kb3cob2JqZWN0KToNCSIiIk9wZW4gYSBGaW5kZXIgd2luZG93
IGZvciBvYmplY3QsIFNwZWNpZnkgb2JqZWN0IGJ5IG5hbWUgb3IgZnNzcGVjLiIiIg0J
ZmluZGVyID0gX2dldGZpbmRlcigpDQlvYmplY3QgPSBtYWNmcy5GU1NwZWMob2JqZWN0
KQ0JZnNzID0gbWFjZnMuRlNTcGVjKG9iamVjdCkNCW9iamVjdF9hbGlhcyA9IGZzcy5O
ZXdBbGlhcygpDQlhcmdzID0ge30NCWF0dHJzID0ge30NCV9jb2RlID0gJ2FldnQnDQlf
c3ViY29kZSA9ICdvZG9jJw0JYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVy
KHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVj
dF9hbGlhcywgZnI9Tm9uZSkNCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzANCV9yZXBseSwg
YXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0
dHJzKQ0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6DQkJcmFpc2UgbW9yZWZpbmRlcnRv
b2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykNCQ1kZWYgY2xvc2V3aW5k
b3cob2JqZWN0KToNCSIiIkNsb3NlIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyLCBT
cGVjaWZ5IGJ5IHBhdGguIiIiDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkNCWZzcyA9IG1h
Y2ZzLkZTU3BlYyhvYmplY3QpDQlvYmplY3RfYWxpYXMgPSBmc3MuTmV3QWxpYXMoKQ0J
YXJncyA9IHt9DQlhdHRycyA9IHt9DQlfY29kZSA9ICdjb3JlJw0JX3N1YmNvZGUgPSAn
Y2xvcycNCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlw
ZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZy
PU5vbmUpDQlhcmdzWyctLS0tJ10gPSBhZW9ial8wDQlfcmVwbHksIGFyZ3MsIGF0dHJz
ID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykNCWlmIGFy
Z3MuaGFzX2tleSgnZXJybicpOg0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBh
ZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpDQ1kZWYgbG9jYXRpb24ob2JqZWN0LCBwb3M9
Tm9uZSk6DQkiIiJTZXQgdGhlIHBvc2l0aW9uIG9mIGEgRmluZGVyIHdpbmRvdyBmb3Ig
Zm9sZGVyIHRvIHBvcz0odywgaCkuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3Bl
Yy4NCUlmIHBvcz1Ob25lLCBsb2NhdGlvbiB3aWxsIHJldHVybiB0aGUgY3VycmVudCBw
b3NpdGlvbiBvZiB0aGUgb2JqZWN0LiIiIg0JZnNzID0gbWFjZnMuRlNTcGVjKG9iamVj
dCkNCW9iamVjdF9hbGlhcyA9IGZzcy5OZXdBbGlhcygpDQlpZiBub3QgcG9zOg0JCXJl
dHVybiBfZ2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzKQ0JcmV0dXJuIF9zZXRsb2NhdGlv
bihvYmplY3RfYWxpYXMsIHBvcykNCQ1kZWYgX3NldGxvY2F0aW9uKG9iamVjdF9hbGlh
cywgKHgsIHkpKToNCSIiIl9zZXRsb2NhdGlvbjogU2V0IHRoZSBsb2NhdGlvbiBvZiB0
aGUgaWNvbiBmb3IgdGhlIG9iamVjdC4iIiINCWZpbmRlciA9IF9nZXRmaW5kZXIoKQ0J
YXJncyA9IHt9DQlhdHRycyA9IHt9DQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3Bl
Y2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxk
PW9iamVjdF9hbGlhcywgZnI9Tm9uZSkNCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RT
cGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNl
bGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzAwKQ0JYXJnc1snLS0tLSdd
ID0gYWVvYmpfMDENCWFyZ3NbImRhdGEiXSA9IFt4LCB5XQ0JX3JlcGx5LCBhcmdzLCBh
dHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgInNldGQiLCBhcmdzLCBhdHRycykNCWlm
IGFyZ3MuaGFzX2tleSgnZXJybicpOg0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9y
LCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpDQlyZXR1cm4gKHgseSkNCQ1kZWYgX2dl
dGxvY2F0aW9uKG9iamVjdF9hbGlhcyk6DQkiIiJfZ2V0bG9jYXRpb246IGdldCB0aGUg
bG9jYXRpb24gb2YgdGhlIGljb24gZm9yIHRoZSBvYmplY3QuIiIiDQlmaW5kZXIgPSBf
Z2V0ZmluZGVyKCkNCWFyZ3MgPSB7fQ0JYXR0cnMgPSB7fQ0JYWVvYmpfMDAgPSBhZXR5
cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3Jt
PSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpDQlhZW9ial8wMSA9IGFl
dHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZv
cm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncG9zbicpLCBmcj1hZW9ial8wMCkN
CWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxDQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmlu
ZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQ0JaWYgYXJncy5oYXNf
a2V5KCdlcnJuJyk6DQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMu
ZGVjb2RlZXJyb3IoYXJncykNCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOg0JCXBvcyA9
IGFyZ3NbJy0tLS0nXQ0JCXJldHVybiBwb3MuaCwgcG9zLnYNDWRlZiBsYWJlbChvYmpl
Y3QsIGluZGV4PU5vbmUpOg0JIiIibGFiZWw6IHNldCBvciBnZXQgdGhlIGxhYmVsIG9m
IHRoZSBpdGVtLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuIiIiDQlmc3Mg
PSBtYWNmcy5GU1NwZWMob2JqZWN0KQ0Jb2JqZWN0X2FsaWFzID0gZnNzLk5ld0FsaWFz
KCkNCWlmIGluZGV4ID09IE5vbmU6DQkJcmV0dXJuIF9nZXRsYWJlbChvYmplY3RfYWxp
YXMpDQlpZiBpbmRleCA8IDAgb3IgaW5kZXggPiA3Og0JCWluZGV4ID0gMA0JcmV0dXJu
IF9zZXRsYWJlbChvYmplY3RfYWxpYXMsIGluZGV4KQ0JDWRlZiBfZ2V0bGFiZWwob2Jq
ZWN0X2FsaWFzKToNCSIiImxhYmVsOiBHZXQgdGhlIGxhYmVsIGZvciB0aGUgb2JqZWN0
LiIiIg0JZmluZGVyID0gX2dldGZpbmRlcigpDQlhcmdzID0ge30NCWF0dHJzID0ge30N
CWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5
cGUoJ2NvYmonKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25l
KQ0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMu
VHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2xhYmkn
KSwgZnI9YWVvYmpfMDApDQlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQ0JX3JlcGx5LCBh
cmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRy
cykNCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOg0JCXJhaXNlIG1vcmVmaW5kZXJ0b29s
c2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpDQlpZiBhcmdzLmhhc19rZXko
Jy0tLS0nKToNCQlyZXR1cm4gYXJnc1snLS0tLSddDQ1kZWYgX3NldGxhYmVsKG9iamVj
dF9hbGlhcywgaW5kZXgpOg0JIiIibGFiZWw6IFNldCB0aGUgbGFiZWwgZm9yIHRoZSBv
YmplY3QuIiIiDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkNCWFyZ3MgPSB7fQ0JYXR0cnMg
PSB7fQ0JX2NvZGUgPSAnY29yZScNCV9zdWJjb2RlID0gJ3NldGQnDQlhZW9ial8wID0g
YWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwN
CQkJZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQ0JYWVvYmpf
MSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9w
JyksDQkJCWZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnbGFiaScpLCBmcj1h
ZW9ial8wKQ0JYXJnc1snLS0tLSddID0gYWVvYmpfMQ0JYXJnc1siZGF0YSJdID0gaW5k
ZXgNCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNv
ZGUsIGFyZ3MsIGF0dHJzKQ0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6DQkJcmFpc2Ug
bW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykNCXJl
dHVybiBpbmRleA0NZGVmIHdpbmRvd3ZpZXcoZm9sZGVyLCB2aWV3PU5vbmUpOg0JIiIi
d2luZG93dmlldzogU2V0IHRoZSB2aWV3IG9mIHRoZSB3aW5kb3cgZm9yIHRoZSBmb2xk
ZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4NCTAgPSBieSBpY29uIChk
ZWZhdWx0KQ0JMSA9IGJ5IG5hbWUNCTIgPSBieSBidXR0b24NCSIiIg0JZnNzID0gbWFj
ZnMuRlNTcGVjKGZvbGRlcikNCWZvbGRlcl9hbGlhcyA9IGZzcy5OZXdBbGlhcygpDQlp
ZiB2aWV3ID09IE5vbmU6DQkJcmV0dXJuIF9nZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlh
cykNCXJldHVybiBfc2V0d2luZG93dmlldyhmb2xkZXJfYWxpYXMsIHZpZXcpDQkNZGVm
IF9zZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcywgdmlldz0wKToNCSIiInNldCB0aGUg
d2luZG93dmlldyIiIg0JYXR0cnMgPSB7fQ0JYXJncyA9IHt9DQlpZiB2aWV3ID09IDE6
DQkJX3YgPSBhZXR5cGVzLlR5cGUoJ3BuYW0nKQ0JZWxpZiB2aWV3ID09IDI6DQkJX3Yg
PSBhZXR5cGVzLlR5cGUoJ2xnYnUnKQ0JZWxzZToNCQlfdiA9IGFldHlwZXMuVHlwZSgn
aWltZycpDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkNCWFlb2JqXzAgPSBhZXR5cGVzLk9i
amVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdjZm9sJyksIA0JCQlmb3Jt
ID0gJ2FsaXMnLCBzZWxkID0gZm9sZGVyX2FsaWFzLCBmcj1Ob25lKQ0JYWVvYmpfMSA9
IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3An
KSwgDQkJCWZvcm0gPSAncHJvcCcsIHNlbGQgPSBhZXR5cGVzLlR5cGUoJ2N3bmQnKSwg
ZnI9YWVvYmpfMCkNCWFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50
ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksIA0JCQlmb3JtID0gJ3Byb3AnLCBzZWxkID0g
YWV0eXBlcy5UeXBlKCdwdmV3JyksIGZyPWFlb2JqXzEpDQlhZW9ial8zID0gYWV0eXBl
cy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgncHJvcCcpLCANCQkJ
Zm9ybSA9ICdwcm9wJywgc2VsZCA9IF92LCBmcj1Ob25lKQ0JX2NvZGUgPSAnY29yZScN
CV9zdWJjb2RlID0gJ3NldGQnDQlhcmdzWyctLS0tJ10gPSBhZW9ial8yDQlhcmdzWydk
YXRhJ10gPSBhZW9ial8zDQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQo
X2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykNCWlmIGFyZ3MuaGFzX2tleSgnZXJy
bicpOg0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVy
cm9yKGFyZ3MpDQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToNCQlyZXR1cm4gYXJnc1sn
LS0tLSddDQ1kZWYgX2dldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzKToNCSIiImdldCB0
aGUgd2luZG93dmlldyIiIg0JYXR0cnMgPSB7fQ0JYXJncyA9IHt9DQlmaW5kZXIgPSBf
Z2V0ZmluZGVyKCkNCWFyZ3MgPSB7fQ0JYXR0cnMgPSB7fQ0JYWVvYmpfMDAgPSBhZXR5
cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3Jt
PSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpDQlhZW9ial8wMSA9IGFl
dHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZv
cm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wMCkN
CWFlb2JqXzAyID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5
cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdmV3Jyks
IGZyPWFlb2JqXzAxKQ0JYXJnc1snLS0tLSddID0gYWVvYmpfMDINCV9yZXBseSwgYXJn
cywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMp
DQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToNCQlyYWlzZSBtb3JlZmluZGVydG9vbHNl
cnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQ0Jdmlld3MgPSB7J2lpbWcnOjAs
ICdwbmFtJzoxLCAnbGdidSc6Mn0NCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOg0JCXJl
dHVybiB2aWV3c1thcmdzWyctLS0tJ10uZW51bV0NDWRlZiB3aW5kb3dzaXplKGZvbGRl
ciwgc2l6ZT1Ob25lKToNCSIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cg
Zm9yIGZvbGRlciB0byBzaXplPSh3LCBoKSwgU3BlY2lmeSBieSBwYXRoLg0JSWYgc2l6
ZT1Ob25lLCB3aW5kb3dzaXplIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHNpemUgb2Yg
dGhlIHdpbmRvdy4NCVNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4NCSIiIg0J
ZnNzID0gbWFjZnMuRlNTcGVjKGZvbGRlcikNCWZvbGRlcl9hbGlhcyA9IGZzcy5OZXdB
bGlhcygpDQlvcGVud2luZG93KGZzcykNCWlmIG5vdCBzaXplOg0JCXJldHVybiBfZ2V0
d2luZG93c2l6ZShmb2xkZXJfYWxpYXMpDQlyZXR1cm4gX3NldHdpbmRvd3NpemUoZm9s
ZGVyX2FsaWFzLCBzaXplKQ0JDWRlZiBfc2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMs
ICh3LCBoKSk6DQkiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBm
b2xkZXIgdG8gKHcsIGgpIiIiDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkNCWFyZ3MgPSB7
fQ0JYXR0cnMgPSB7fQ0JX2NvZGUgPSAnY29yZScNCV9zdWJjb2RlID0gJ3NldGQnDQlh
ZXZhcjAwID0gW3csIGhdDQlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIo
d2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwNCQkJZm9ybT0iYWxpcyIsIHNlbGQ9Zm9s
ZGVyX2FsaWFzLCBmcj1Ob25lKQ0JYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lm
aWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIA0JCQlmb3JtPSJwcm9wIiwgc2Vs
ZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkNCWFlb2JqXzIgPSBhZXR5
cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCANCQkJ
Zm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEp
DQlhcmdzWyctLS0tJ10gPSBhZW9ial8yDQlhcmdzWyJkYXRhIl0gPSBhZXZhcjAwDQlf
cmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBh
cmdzLCBhdHRycykNCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOg0JCXJhaXNlIG1vcmVm
aW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpDQlyZXR1cm4g
KHcsIGgpDQkJDWRlZiBfZ2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMpOg0JIiIiU2V0
IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyIHRvICh3LCBoKSIi
Ig0JZmluZGVyID0gX2dldGZpbmRlcigpDQlhcmdzID0ge30NCWF0dHJzID0ge30NCWFl
b2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgn
Y2ZvbCcpLCANCQkJZm9ybT0iYWxpcyIsIHNlbGQ9Zm9sZGVyX2FsaWFzLCBmcj1Ob25l
KQ0JYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5U
eXBlKCdwcm9wJyksIA0JCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3
bmQnKSwgZnI9YWVvYmpfMCkNCWFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmll
cih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCANCQkJZm9ybT0icHJvcCIsIHNlbGQ9
YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzEpDQlhcmdzWyctLS0tJ10gPSBh
ZW9ial8yDQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoJ2NvcmUnLCAn
Z2V0ZCcsIGFyZ3MsIGF0dHJzKQ0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6DQkJcmFp
c2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykN
CWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOg0JCXJldHVybiBhcmdzWyctLS0tJ10NDWRl
ZiB3aW5kb3dwb3NpdGlvbihmb2xkZXIsIHBvcz1Ob25lKToNCSIiIlNldCB0aGUgcG9z
aXRpb24gb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gcG9zPSh3LCBoKS4i
IiINCWZzcyA9IG1hY2ZzLkZTU3BlYyhmb2xkZXIpDQlmb2xkZXJfYWxpYXMgPSBmc3Mu
TmV3QWxpYXMoKQ0Jb3BlbndpbmRvdyhmc3MpDQlpZiBub3QgcG9zOg0JCXJldHVybiBf
Z2V0d2luZG93cG9zaXRpb24oZm9sZGVyX2FsaWFzKQ0JaWYgdHlwZShwb3MpID09IElu
c3RhbmNlVHlwZToNCQkjIHBvcyBtaWdodCBiZSBhIFFEUG9pbnQgb2JqZWN0IGFzIHJl
dHVybmVkIGJ5IF9nZXR3aW5kb3dwb3NpdGlvbg0JCXBvcyA9IChwb3MuaCwgcG9zLnYp
DQlyZXR1cm4gX3NldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcywgcG9zKQ0JCQkN
ZGVmIF9zZXR3aW5kb3dwb3NpdGlvbihmb2xkZXJfYWxpYXMsICh4LCB5KSk6DQkiIiJT
ZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gKHcsIGgp
LiIiIg0JZmluZGVyID0gX2dldGZpbmRlcigpDQlhcmdzID0ge30NCWF0dHJzID0ge30N
CWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlw
ZSgnY2ZvbCcpLCANCQkJZm9ybT0iYWxpcyIsIHNlbGQ9Zm9sZGVyX2FsaWFzLCBmcj1O
b25lKQ0JYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBl
cy5UeXBlKCdwcm9wJyksIA0JCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUo
J2N3bmQnKSwgZnI9YWVvYmpfMCkNCWFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNp
Zmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCANCQkJZm9ybT0icHJvcCIsIHNl
bGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzEpDQlhcmdzWyctLS0tJ10g
PSBhZW9ial8yDQlhcmdzWyJkYXRhIl0gPSBbeCwgeV0NCV9yZXBseSwgYXJncywgYXR0
cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdzZXRkJywgYXJncywgYXR0cnMpDQlpZiBh
cmdzLmhhc19rZXkoJ2Vycm4nKToNCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwg
YWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQ0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6
DQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQ0NZGVmIF9nZXR3aW5kb3dwb3NpdGlvbihmb2xk
ZXJfYWxpYXMpOg0JIiIiR2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3Ig
Zm9sZGVyLCBTcGVjaWZ5IGJ5IHBhdGguIiIiDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkN
CWFyZ3MgPSB7fQ0JYXR0cnMgPSB7fQ0JYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3Bl
Y2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIA0JCQlmb3JtPSJhbGlzIiwg
c2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpDQlhZW9ial8xID0gYWV0eXBlcy5PYmpl
Y3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgDQkJCWZvcm09InBy
b3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQ0JYWVvYmpf
MiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9w
JyksIA0JCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3B0c3onKSwgZnI9
YWVvYmpfMSkNCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzINCV9yZXBseSwgYXJncywgYXR0
cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpDQlpZiBh
cmdzLmhhc19rZXkoJ2Vycm4nKToNCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwg
YWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQ0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6
DQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQ0NZGVmIGljb24ob2JqZWN0LCBpY29uZGF0YT1O
b25lKToNCSIiImljb24gc2V0cyB0aGUgaWNvbiBvZiBvYmplY3QsIGlmIG5vIGljb25k
YXRhIGlzIGdpdmVuLA0JaWNvbiB3aWxsIHJldHVybiBhbiBBRSBvYmplY3Qgd2l0aCBi
aW5hcnkgZGF0YSBmb3IgdGhlIGN1cnJlbnQgaWNvbi4NCUlmIGxlZnQgdW50b3VjaGVk
LCB0aGlzIGRhdGEgY2FuIGJlIHVzZWQgdG8gcGFzdGUgdGhlIGljb24gb24gYW5vdGhl
ciBmaWxlLg0JRGV2ZWxvcG1lbnQgb3Bwb3J0dW5pdHk6IGdldCBhbmQgc2V0IHRoZSBk
YXRhIGFzIFBJQ1QuIiIiDQlmc3MgPSBtYWNmcy5GU1NwZWMob2JqZWN0KQ0Jb2JqZWN0
X2FsaWFzID0gZnNzLk5ld0FsaWFzKCkNCWlmIGljb25kYXRhID09IE5vbmU6DQkJcmV0
dXJuIF9nZXRpY29uKG9iamVjdF9hbGlhcykNCXJldHVybiBfc2V0aWNvbihvYmplY3Rf
YWxpYXMsIGljb25kYXRhKQ0JDWRlZiBfZ2V0aWNvbihvYmplY3RfYWxpYXMpOg0JIiIi
Z2V0IHRoZSBpY29uZGF0YSBmb3Igb2JqZWN0LiBCaW5hcnkgZGF0YSBvZiBzb21lIHNv
cnQuIiIiDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkNCWFyZ3MgPSB7fQ0JYXR0cnMgPSB7
fQ0JYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMu
VHlwZSgnY29iaicpLCANCQkJZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBm
cj1Ob25lKQ0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFl
dHlwZXMuVHlwZSgncHJvcCcpLCANCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5U
eXBlKCdpaW1nJyksIGZyPWFlb2JqXzAwKQ0JYXJnc1snLS0tLSddID0gYWVvYmpfMDEN
CV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwg
YXJncywgYXR0cnMpDQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToNCQlyYWlzZSBtb3Jl
ZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQ0JaWYgYXJn
cy5oYXNfa2V5KCctLS0tJyk6DQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQ0NZGVmIF9zZXRp
Y29uKG9iamVjdF9hbGlhcywgaWNvbmRhdGEpOg0JIiIic2V0IHRoZSBpY29uZGF0YSBm
b3Igb2JqZWN0LCBmb3JtYXR0ZWQgYXMgcHJvZHVjZWQgYnkgX2dldGljb24oKSIiIg0J
ZmluZGVyID0gX2dldGZpbmRlcigpDQlhcmdzID0ge30NCWF0dHJzID0ge30NCWFlb2Jq
XzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nv
YmonKSwgDQkJCWZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkN
CWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5
cGUoJ3Byb3AnKSwgDQkJCWZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnaWlt
ZycpLCBmcj1hZW9ial8wMCkNCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxDQlhcmdzWyJk
YXRhIl0gPSBpY29uZGF0YQ0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5k
KCJjb3JlIiwgInNldGQiLCBhcmdzLCBhdHRycykNCWlmIGFyZ3MuaGFzX2tleSgnZXJy
bicpOg0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVy
cm9yKGFyZ3MpDQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToNCQlyZXR1cm4gYXJnc1sn
LS0tLSddLmRhdGENDQ0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tDSMJVm9sdW1lcyBhbmQgc2VydmVycy4NCQ1kZWYgbW91bnR2
b2x1bWUodm9sdW1lLCBzZXJ2ZXI9Tm9uZSwgdXNlcm5hbWU9Tm9uZSwgcGFzc3dvcmQ9
Tm9uZSk6DQkiIiJtb3VudCBhIHZvbHVtZSwgbG9jYWwgb3Igb24gYSBzZXJ2ZXIgb24g
QXBwbGVUYWxrLg0JTm90ZTogbW91bnRpbmcgYSBBU0lQIHNlcnZlciByZXF1aXJlcyBh
IGRpZmZlcmVudCBvcGVyYXRpb24uDQlzZXJ2ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHNl
cnZlciB3aGVyZSB0aGUgdm9sdW1lIGJlbG9uZ3MNCXVzZXJuYW1lLCBwYXNzd29yZCBi
ZWxvbmcgdG8gYSByZWdpc3RlcmVkIHVzZXIgb2YgdGhlIHZvbHVtZS4iIiINCWZpbmRl
ciA9IF9nZXRmaW5kZXIoKQ0JYXJncyA9IHt9DQlhdHRycyA9IHt9DQlpZiBwYXNzd29y
ZDoNCQlhcmdzWyJQQVNTIl0gPSBwYXNzd29yZA0JaWYgdXNlcm5hbWU6DQkJYXJnc1si
VVNFUiJdID0gdXNlcm5hbWUNCWlmIHNlcnZlcjoNCQlhcmdzWyJTUlZSIl0gPSBzZXJ2
ZXINCWFyZ3NbJy0tLS0nXSA9IHZvbHVtZQ0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZp
bmRlci5zZW5kKCJhZXZ0IiwgIm12b2wiLCBhcmdzLCBhdHRycykNCWlmIGFyZ3MuaGFz
X2tleSgnZXJybicpOg0JCXJhaXNlIG1vcmVmaW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xz
LmRlY29kZWVycm9yKGFyZ3MpDQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToNCQlyZXR1
cm4gYXJnc1snLS0tLSddDQ1kZWYgdW5tb3VudHZvbHVtZSh2b2x1bWUpOg0JIiIidW5t
b3VudCBhIHZvbHVtZSB0aGF0J3Mgb24gdGhlIGRlc2t0b3AiIiINCXB1dGF3YXkodm9s
dW1lKQ0JDWRlZiBwdXRhd2F5KG9iamVjdCk6DQkiIiJwdXRoIHRoZSBvYmplY3QgYXdh
eSwgd2hlcmVldmVyIGl0IGNhbWUgZnJvbS4iIiINCWZpbmRlciA9IF9nZXRmaW5kZXIo
KQ0JYXJncyA9IHt9DQlhdHRycyA9IHt9DQlhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9i
amVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2RpcycpLCBmb3JtPSJuYW1l
Iiwgc2VsZD1vYmplY3QsIGZyPU5vbmUpDQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gdGFs
a2VyLnNlbmQoImZuZHIiLCAicHR3eSIsIGFyZ3MsIGF0dHJzKQ0JaWYgYXJncy5oYXNf
a2V5KCdlcnJuJyk6DQkJcmFpc2UgbW9yZWZpbmRlcnRvb2xzZXJyb3IsIGFldG9vbHMu
ZGVjb2RlZXJyb3IoYXJncykNCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOg0JCXJldHVy
biBhcmdzWyctLS0tJ10NDQ0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tDSMJTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMNIw0NZGVm
IHZvbHVtZWxldmVsKGxldmVsKToNCSIiInNldCB0aGUgYXVkaW8gb3V0cHV0IGxldmVs
LCBwYXJhbWV0ZXIgYmV0d2VlbiAwIChzaWxlbnQpIGFuZCA3IChmdWxsIGJsYXN0KSIi
Ig0JZmluZGVyID0gX2dldGZpbmRlcigpDQlhcmdzID0ge30NCWF0dHJzID0ge30NCWlm
IGxldmVsIDwgMDoNCQlsZXZlbCA9IDANCWVsaWYgbGV2ZWwgPiA3Og0JCWxldmVsID0g
Nw0JYXJnc1snLS0tLSddID0gbGV2ZWwNCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5k
ZXIuc2VuZCgiYWV2dCIsICJzdHZsIiwgYXJncywgYXR0cnMpDQlpZiBhcmdzLmhhc19r
ZXkoJ2Vycm4nKToNCQlyYWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5k
ZWNvZGVlcnJvcihhcmdzKQ0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6DQkJcmV0dXJu
IGFyZ3NbJy0tLS0nXQ0NZGVmIE9TdmVyc2lvbigpOg0JIiIicmV0dXJuIHRoZSB2ZXJz
aW9uIG9mIHRoZSBzeXN0ZW0gc29mdHdhcmUiIiINCWZpbmRlciA9IF9nZXRmaW5kZXIo
KQ0JYXJncyA9IHt9DQlhdHRycyA9IHt9DQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0
U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBz
ZWxkPWFldHlwZXMuVHlwZSgndmVyMicpLCBmcj1Ob25lKQ0JYXJnc1snLS0tLSddID0g
YWVvYmpfMDANCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIs
ICJnZXRkIiwgYXJncywgYXR0cnMpDQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToNCQly
YWlzZSBtb3JlZmluZGVydG9vbHNlcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdz
KQ0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6DQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQ0N
ZGVmIGZpbGVzaGFyaW5nKCk6DQkiIiJyZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzIG9m
IGZpbGVzaGFyaW5nIGFuZCB3aGV0aGVyIGl0IGlzIHN0YXJ0aW5nIHVwIG9yIG5vdDoN
CQktMQlmaWxlIHNoYXJpbmcgaXMgb2ZmIGFuZCBub3Qgc3RhcnRpbmcgdXANCQkwCWZp
bGUgc2hhcmluZyBpcyBvZmYgYW5kIHN0YXJ0aW5nIHVwDQkJMQlmaWxlIHNoYXJpbmcg
aXMgb24iIiINCXN0YXR1cyA9IC0xDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkNCSMgc2Vl
IGlmIGl0IGlzIG9uDQlhcmdzID0ge30NCWF0dHJzID0ge30NCWFyZ3NbJy0tLS0nXSA9
IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyks
IGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnZnNocicpLCBmcj1Ob25lKQ0J
X3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBh
cmdzLCBhdHRycykNCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOg0JCXJhaXNlIG1vcmVm
aW5kZXJ0b29sc2Vycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpDQlpZiBhcmdz
Lmhhc19rZXkoJy0tLS0nKToNCQlpZiBhcmdzWyctLS0tJ10gPT0gMDoNCQkJc3RhdHVz
ID0gLTENCQllbHNlOg0JCQlzdGF0dXMgPSAxDQkjIGlzIGl0IHN0YXJ0aW5nIHVwIHBl
cmNoYW5jZT8NCWFyZ3MgPSB7fQ0JYXR0cnMgPSB7fQ0JYXJnc1snLS0tLSddID0gYWV0
eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9y
bT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdmc3VwJyksIGZyPU5vbmUpDQlfcmVw
bHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3Ms
IGF0dHJzKQ0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6DQkJcmFpc2UgbW9yZWZpbmRl
cnRvb2xzZXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykNCWlmIGFyZ3MuaGFz
X2tleSgnLS0tLScpOg0JCWlmIGFyZ3NbJy0tLS0nXSA9PSAxOg0JCQlzdGF0dXMgPSAw
DQlyZXR1cm4gc3RhdHVzDQkNZGVmIG1vdmV0b3RyYXNoKHBhdGgpOg0JIiIibW92ZSB0
aGUgb2JqZWN0IHRvIHRoZSB0cmFzaCIiIg0JZnNzID0gbWFjZnMuRlNTcGVjKHBhdGgp
DQl0cmFzaGZvbGRlciA9IG1hY2ZzLkZTU3BlYyhtYWNmcy5GaW5kRm9sZGVyKGZzcy5h
c190dXBsZSgpWzBdLCAndHJzaCcsIDApICsgKCIiLCkpLmFzX3BhdGhuYW1lKCkNCWZp
bmRlcnRvb2xzLm1vdmUocGF0aCwgdHJhc2hmb2xkZXIpDQ1kZWYgZW1wdHl0cmFzaCgp
Og0JIiIiZW1wdHkgdGhlIHRyYXNoIiIiDQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkNCWFy
Z3MgPSB7fQ0JYXR0cnMgPSB7fQ0JYXJnc1snLS0tLSddID0gYWV0eXBlcy5PYmplY3RT
cGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNl
bGQ9YWV0eXBlcy5UeXBlKCd0cnNoJyksIGZyPU5vbmUpDQlfcmVwbHksIGFyZ3MsIGF0
dHJzID0gZmluZGVyLnNlbmQoImZuZHIiLCAiZW1wdCIsIGFyZ3MsIGF0dHJzKQ0JaWYg
YXJncy5oYXNfa2V5KCdlcnJuJyk6DQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29s
cy5kZWNvZGVlcnJvcihhcmdzKQ0=
--============_-1224577438==_D============--
--============_-1224577438==_============
Content-Type: text/plain; charset="iso-8859-1" ; format="flowed"
Content-Transfer-Encoding: 8bit

-- 
"Faites des phrases courtes. Un sujet, un verbe, un complément. Quand 
vous voudrez ajouter un adjectif, vous viendrez me voir." - Georges 
Clemenceau, 1841-1929, médecin et homme politique français. Consignes 
aux journalistes de "L'Aurore". d'après 
<http://www.sit.ulaval.ca/pagespersonnelles/phf/pensee.html> 
--============_-1224577438==_============--