OOP_(re)

Tue, 27 May 1997 16:46:48 -0400 (EDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---305287625-1281818584-864766008=:11773
Content-Type: TEXT/PLAIN; charset=US-ASCII

On Tue, 27 May 1997, Peter Gerwinski wrote:

> > If the VMT offset given is the same as the called constructor, then it is
> > the first constructor called and the object is initialized. If the VMT
> > parameter isn't the same as the called constructor, it is because it is
> > being called from within another constructor and hence the object is
> > already initialized. This is actually easy! ;-)
> 
> Sorry, but I don't understand this (perhaps it's too easy for me;).
> How can the VMT offset be the same as a constructor?  AFAIK, BP passes a
> VMT offset of zero to constructors which shall *not* initialize an object.

Hmm... Maybe you're right, it's been a few months since I booted DOS to
check this out... ;-) As far as I remember, it works like this:

o The code generated by New(TThatObject, Init) calls TThatObject.Init with
  TThatObject's VMT link and nil as the Self parameter.
o TThatObject.Init does a "inherited Init", and since it is descended from
  TObject, it calls TObject.Init, with TThatObject's VMT link again and
  the correct Self parameter. TObject's Init constructor knows it doesn't
  need to allocate memory since there Self isn't nil and doesn't
  initialize the VMT of the instance since the VMT link parameter passed
  is TThatObject's VMT link, not his own.

But you could very well be right regarding the VMT offset passed, it would
achieve the very same thing, and passing zero would indeed be simpler.

> > This doesn't give much information about the object apart from its size
> > and the number of methods and where they are... What we'd need is
> > something like from which class is another class derived from, its name,
> > and so on...
> 
> So we should extend the VMT.  Okay, why not ...
> 
> BTW, somebody knows a reasonable way how to implement multiple inheritance?

I strongly advises *agains't* multiple inheritance. It is the OOP 'goto'
equivalent. Everything MI can do, you can do without MI if you design
well. C++ is the bloated monster we know today in part because of that
pseudo-feature. Neither Modula-3 or Oberon has multiple inheritance and
both have been used in programming operating systems and huges projects.

> > Hmm... Is it possible to have a function automatically generated by the
> > compiler before going to the optimizing stage? It would contain a table
> > translating VMT pointers into strings of the classes name
> 
> No problem.
> 
> > and would be
> > optimized out of the program by the optimizer if unused, right?
> 
> True for a Program, false for a Unit.  While the GPC compiler is *much*
> smarter than BP and would remove unused code and variables, the GNU linker
> is not able to remove dead code, it only does so if a whole Unit is unused.

Could this compiler generated function be generated in the program? Then
it would be optimized out if unused? On the other hand, maybe we should do
differently. In BP, there is a switch to have object symbols in for the
object browser. It is separate from the debugging symbol switch. Maybe we
could have a switch to have the object names and parent/childs
informations included, which the ClassName() and others functions would
consult. If the information isn't there, the ClassName() function would
return "Unknown", an empty string or something similar... This information
could be included in the VMT? This is more for you to decide... :-)

> > What I mean is (for example) a NewObject() function that would work just
> > like New(), but instead of a typed pointer or an object type itself, it
> > would take a VMT pointer as the first parameter. It would make the
> > construction of an object from a stream as simple as calling
> > "Get:=NewObject(TStreamRec.VMTLink, Load(@Self));" at the end of the 
> > TStream.Get method.
> 
> It should not be difficult to implement this using `GetMem' and an explicit
> assignment to `TypeOf'.

I think you are right, and anyway, thinking more about this, NewObject()
would be very difficult to implement correctly. And whatever we do, we'll
have to know the address of the Load constructor anyway (just like with
the BP registration system). Unless it is virtual. I think *my* object
library will have a virtual Load method (which won't be a constructor).
Ok, can you give me an example of how to create an instance of a type
specified by TypeOf? Would probably look like this:

function TStream.Get: PObject;
var
	ObjID: word;
	VMTLink: pointer;
	LoadPtr: pointer;
	P: PObject;
begin
	{	here some code to read the ObjID and fetch the
		corresponding VMTLink. }
	GetMem(P, word(VMTLink^));
	TypeOf(P):=VMTLink;
	{ call the LoadPtr constructor, how do I do this correctly? }
	{ With @Self as the 'normal' parameter of course... }
end; 

Hmm... One thing I think isn't very clean is the way TypeOf() works "in
reverse"... It is *very* peculiar IMHO to set a value to a function! Maybe
more something like SetTypeOf(P, VMTLink)? ;-) Attached to this message is
the OBJECTS.PAS that goes with FPK-Pascal... Take a look at TObject and
TStream.Get implementations...

> > BTW, how does New() work when it is passed an object type (say, PObject)
> > as the first parameter?
> 
> The compiler picks up the (constant) size of the object, calls `GetMem',
> initializes the VMT field and finally calls the constructor. (In BP, the
> value for the VMT field is passed to the constructor which does the
> assignment, but I see no reason for that.)

So a constructor does *NOTHING* more than a normal procedure? Umm... What
is the interest in a constructor then? :-)

Pierre Phaneuf

"The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offense." - Edsger W. Dijkstra.

---305287625-1281818584-864766008=:11773
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="OBJECTS.pas"
Content-Transfer-Encoding: BASE64
Content-ID: 
Content-Description: OBJECTS.PAS from FPK-Pascal

eyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNDQogICAgICAgICAg
ICAgICAgICAgICBUaGlzIGlzIGEgc291cmNlIGZpbGUgb2YgRnJlZVZpc2lv
bg0NCg0NCiAgICAgICAgICAgICAgICAgICAgIHBhcnRzIGNvcHlyaWdodCAo
YykgMTk5Miw5NiBieSBGbG9yaWFuIEtsYWVtcGZsDQ0KICAgICAgICAgICAg
ICAgICAgICAgICBmbmtsYWVtcEBjaXAuZnQudW5pLWVybGFuZ2VuLmRlDQ0K
DQ0KICAgICAgICAgICAgICAgICAgICAgcGFydHMgY29weXJpZ2h0IChjKSAx
OTk2IGJ5IEZyYW5rIFpBR08NDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICB6YWdvQGVjb2xlZG9jLmlwYy5mcg0NCg0NCiAgICAgICAgICAgICAgICAg
ICAgICBwYXJ0cyBjb3B5cmlnaHQgKGMpIDE5OTUgYnkgTUggU3BpZWdlbA0N
Cg0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY29kZSBpcyBm
cmVld2FyZQ0NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqfQ0N
Cg0NCnsgSGlzdG9yeToNDQogICAgMy8xMC8xOTk2IFZlcnNpb24gMC4xDQ0K
ICAgICAgIC0gZmlyc3QgaW1wbGVtZW50YXRpb24NDQogICAgMy8xNS8xOTk2
DQ0KICAgICAgIC0gc29tZSBzdWdnZXN0aW9ucyBvZiBGcmFuayBaYWdvIGlt
cGxlbWVudGVkDQ0KICAgICAgIC0gdGNvbGxlY3Rpb24gaXMgZnVsbCBpbXBs
ZW1lbnRlZA0NCiAgICAzLzE3LzE5OTYNDQogICAgICAgLSBpbnRlcmZhY2Ug
Zm9yIHN0cmluZyBsaXN0cyBpbXBsZW1lbnRlZA0NCiAgICAgICAtIHRzdHJp
bmdsaXN0IHVuZCB0c3RybGlzdG1ha2VyIGFyZSBpbXBsZW1lbnRlZA0NCn0N
DQp7JEUtfQ0NCnskZGVmaW5lIE5PRVhDRVBUSU9OU30NDQp7JGRlZmluZSBT
U1RSSU5HfQ0NCnVuaXQgb2JqZWN0czsNDQoNDQogIGludGVyZmFjZQ0NCg0N
CiAgICBjb25zdA0NCiAgICAgICB7IEdPMzIgc3VwcG9ydHMgMTI4IE1CIGRh
dGEgfQ0NCiAgICAgICBtYXhjb2xsZWN0aW9uc2l6ZSA9ICgxMjgqMTAyNCox
MDI0LTEpIGRpdiBzaXplb2YocG9pbnRlcik7DQ0KDQ0KICAgICAgIGNvaW5k
ZXhlcnJvciA9IC0xOw0NCiAgICAgICBjb292ZXJmbG93ID0gLTI7DQ0KDQ0K
ICAgICAgIHZtdGhlYWRlcnNpemUgPSAxMjsNDQoNDQogICAgdHlwZQ0NCiAg
ICAgICB0Y2hhcnNldCA9IHNldCBvZiBjaGFyOw0NCiAgICAgICBwY2hhcnNl
dCA9IF50Y2hhcnNldDsNDQogICAgICAgDQ0KICAgICAgIHRieXRlYXJyYXkg
PSBhcnJheVswLi4xNioxMDI0KjEwMjQtMV0gb2YgYnl0ZTsNDQogICAgICAg
cGJ5dGVhcnJheSA9IF50Ynl0ZWFycmF5Ow0NCiAgICAgICANDQogICAgICAg
dHdvcmRhcnJheSA9IGFycmF5WzAuLjE2KjEwMjQqMTAyNC0xXSBvZiB3b3Jk
Ow0NCiAgICAgICBwd29yZGFycmF5ID0gXnR3b3JkYXJyYXk7DQ0KICAgICAg
IA0NCiAgICAgICB3b3JkcmVjID0gcmVjb3JkDQ0KICAgICAgICAgIGxvLGhp
IDogYnl0ZTsNDQogICAgICAgZW5kOw0NCiAgICAgICANDQogICAgICAgbG9u
Z3JlYyA9IHJlY29yZA0NCiAgICAgICAgICBsbyxoaSA6IHdvcmQ7DQ0KICAg
ICAgIGVuZDsNDQogICAgICAgDQ0KICAgICAgIHsgdGhpcyBpcyBhIHByb2Js
ZW0gfQ0NCiAgICAgICBwdHJyZWMgPSByZWNvcmQNDQogICAgICAgICAgb2Zz
LHNlZyA6IHdvcmQ7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgICAgcHN0cmlu
ZyA9IF5zdHJpbmc7DQ0KICAgICAgIHBsb25naW50ID0gXmxvbmdpbnQ7DQ0K
ICAgICAgIHB3b3JkID0gXndvcmQ7DQ0KICAgICAgIHBieXRlID0gXmJ5dGU7
DQ0KDQ0KICAgICAgIGZuYW1lc3RyID0gc3RyaW5nOyAgeyBmb3IgbGludXgs
IE9TLzIgLi4uIH0NDQoNDQogICAgICAgcHBvaW50ID0gXnRwb2ludDsNDQog
ICAgICAgDQ0KICAgICAgIHRwb2ludCA9IHJlY29yZA0NCiAgICAgICAgICB4
LHkgOiBsb25naW50Ow0NCiAgICAgICBlbmQ7DQ0KDQ0KICAgICAgIHByZWN0
ID0gXnRyZWN0Ow0NCiAgICAgICANDQogICAgICAgdHJlY3QgPSBvYmplY3QN
DQogICAgICAgICAgYSxiIDogdHBvaW50Ow0NCiAgICAgICAgICBwcm9jZWR1
cmUgYXNzaWduKHhhLHlhLHhiLHliIDogbG9uZ2ludCk7DQ0KICAgICAgICAg
IHByb2NlZHVyZSBjb3B5KHIgOiB0cmVjdCk7DQ0KICAgICAgICAgIHByb2Nl
ZHVyZSBtb3ZlKGFkeCxhZHkgOiBsb25naW50KTsNDQogICAgICAgICAgcHJv
Y2VkdXJlIGdyb3coYWR4LGFkeSA6IGxvbmdpbnQpOw0NCiAgICAgICAgICBw
cm9jZWR1cmUgaW50ZXJzZWN0KHIgOiB0cmVjdCk7DQ0KICAgICAgICAgIHBy
b2NlZHVyZSB1bmlvbihyIDogdHJlY3QpOw0NCiAgICAgICAgICBwcm9jZWR1
cmUgY2hlY2tlbXB0eTsNDQogICAgICAgICAgZnVuY3Rpb24gY29udGFpbnMo
cCA6IHRwb2ludCkgOiBib29sZWFuOw0NCiAgICAgICAgICBmdW5jdGlvbiBl
cXVhbHMociA6IHRyZWN0KSA6IGJvb2xlYW47DQ0KICAgICAgICAgIGZ1bmN0
aW9uIGVtcHR5IDogYm9vbGVhbjsNDQogICAgICAgZW5kOw0NCiAgICAgICAN
DQogICAgICAgcG9iamVjdCA9IF50b2JqZWN0Ow0NCiAgICAgICANDQogICAg
ICAgdG9iamVjdCA9IG9iamVjdA0NCiAgICAgICAgICBjb25zdHJ1Y3RvciBp
bml0Ow0NCiAgICAgICAgICBkZXN0cnVjdG9yIGRvbmU7dmlydHVhbDsNDQog
ICAgICAgICAgcHJvY2VkdXJlIGZyZWU7dmlydHVhbDsNDQogICAgICAgZW5k
Ow0NCiAgICAgICANDQogICAgICAgcHN0cmVhbXJlYyA9IF50c3RyZWFtcmVj
Ow0NCiAgICAgICANDQogICAgICAgdHN0cmVhbXJlYyA9IHJlY29yZA0NCiAg
ICAgICAgICB7IHdlIG5ldmVyIG5lZWQgcmVhbGx5IHRoaXMsIGJ1dCAuLi59
DQ0KICAgICAgICAgIG9ianR5cGUgOiBsb25naW50Ow0NCg0NCiAgICAgICAg
ICB2bXRsaW5rIDogcG9pbnRlcjsNDQogICAgICAgICAgbG9hZCA6IHBvaW50
ZXI7DQ0KICAgICAgICAgIHN0b3JlIDogcG9pbnRlcjsNDQogICAgICAgICAg
bmV4dCA6IHBvaW50ZXI7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgICAgcHN0
cmVhbSA9IF50c3RyZWFtOw0NCg0NCiAgICAgICB0c3RyZWFtID0gb2JqZWN0
KHRvYmplY3QpDQ0KICAgICAgICAgIGVycm9yaW5mbyA6IGxvbmdpbnQ7DQ0K
ICAgICAgICAgIHN0YXR1cyA6IGxvbmdpbnQ7DQ0KCSAgcHJvY2VkdXJlIGNv
cHlmcm9tKHZhciBzIDogdHN0cmVhbTtjb3VudCA6IGxvbmdpbnQpOw0NCgkg
IHByb2NlZHVyZSBlcnJvcihjb2RlLGluZm8gOiBsb25naW50KTt2aXJ0dWFs
Ow0NCgkgIHByb2NlZHVyZSBmbHVzaDt2aXJ0dWFsOw0NCgkgIGZ1bmN0aW9u
IGdldCA6IHBvYmplY3Q7DQ0KCSAgZnVuY3Rpb24gZ2V0cG9zIDogbG9uZ2lu
dDt2aXJ0dWFsOw0NCgkgIGZ1bmN0aW9uIGdldHNpemUgOiBsb25naW50O3Zp
cnR1YWw7DQ0KCSAgcHJvY2VkdXJlIHB1dChwIDogcG9iamVjdCk7DQ0KCSAg
cHJvY2VkdXJlIHJlYWQodmFyIGJ1Zjtjb3VudCA6IGxvbmdpbnQpO3ZpcnR1
YWw7DQ0KCSAgZnVuY3Rpb24gcmVhZHN0ciA6IHBzdHJpbmc7DQ0KCSAgcHJv
Y2VkdXJlIHJlc2V0Ow0NCgkgIHByb2NlZHVyZSBzZWVrKHBvcyA6IGxvbmdp
bnQpO3ZpcnR1YWw7DQ0KCSAgcHJvY2VkdXJlIHRydW5jYXRlO3ZpcnR1YWw7
DQ0KCSAgcHJvY2VkdXJlIHdyaXRlKHZhciBidWY7Y291bnQgOiBsb25naW50
KTt2aXJ0dWFsOw0NCgkgIHByb2NlZHVyZSB3cml0ZXN0cihwIDogcHN0cmlu
Zyk7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgICAgcGRvc3N0cmVhbSA9IF50
ZG9zc3RyZWFtOw0NCg0NCiAgICAgICB0ZG9zc3RyZWFtID0gb2JqZWN0KHRz
dHJlYW0pDQ0KICAgICAgICAgIGhhbmRsZSA6IGZpbGU7DQ0KICAgICAgICAg
IGNvbnN0cnVjdG9yIGluaXQoY29uc3QgZmlsZW5hbWUgOiBmbmFtZXN0cjtt
b2RlIDogd29yZCk7DQ0KICAgICAgICAgIGRlc3RydWN0b3IgZG9uZTt2aXJ0
dWFsOw0NCiAgICAgICAgICBmdW5jdGlvbiBnZXRwb3MgOiBsb25naW50O3Zp
cnR1YWw7DQ0KICAgICAgICAgIGZ1bmN0aW9uIGdldHNpemUgOiBsb25naW50
O3ZpcnR1YWw7DQ0KCSAgcHJvY2VkdXJlIHJlYWQodmFyIGJ1Zjtjb3VudCA6
IGxvbmdpbnQpO3ZpcnR1YWw7DQ0KCSAgcHJvY2VkdXJlIHNlZWsocG9zIDog
bG9uZ2ludCk7dmlydHVhbDsNDQoJICBwcm9jZWR1cmUgdHJ1bmNhdGU7dmly
dHVhbDsNDQoJICBwcm9jZWR1cmUgd3JpdGUodmFyIGJ1Zjtjb3VudCA6IGxv
bmdpbnQpO3ZpcnR1YWw7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgICAgdGl0
ZW1saXN0ID0gYXJyYXlbMC4ubWF4Y29sbGVjdGlvbnNpemUtMV0gb2YgcG9p
bnRlcjsNDQoNDQogICAgICAgcGl0ZW1saXN0ID0gXnRpdGVtbGlzdDsNDQoN
DQogICAgICAgcGNvbGxlY3Rpb24gPSBedGNvbGxlY3Rpb247DQ0KDQ0KICAg
ICAgIHRjb2xsZWN0aW9uID0gb2JqZWN0KHRvYmplY3QpDQ0KICAgICAgICAg
IHsgZG9uJ3QgbW9kaWZ5IHRoaXMgISB9DQ0KICAgICAgICAgIGNvdW50IDog
bG9uZ2ludDsNDQogICAgICAgICAgbGltaXQgOiBsb25naW50Ow0NCiAgICAg
ICAgICBkZWx0YSA6IGxvbmdpbnQ7DQ0KICAgICAgICAgIGl0ZW1zIDogcGl0
ZW1saXN0Ow0NCiAgICAgICAgICBjb25zdHJ1Y3RvciBpbml0KGFsaW1pdCxh
ZGVsdGEgOiBsb25naW50KTsNDQogICAgICAgICAgY29uc3RydWN0b3IgbG9h
ZCh2YXIgcyA6IHRzdHJlYW0pOw0NCiAgICAgICAgICBkZXN0cnVjdG9yIGRv
bmU7dmlydHVhbDsNDQogICAgICAgICAgZnVuY3Rpb24gYXQoaW5kZXggOiBs
b25naW50KSA6IHBvaW50ZXI7DQ0KICAgICAgICAgIHByb2NlZHVyZSBhdGRl
bGV0ZShpbmRleCA6IGxvbmdpbnQpOw0NCiAgICAgICAgICBwcm9jZWR1cmUg
YXRmcmVlKGluZGV4IDogbG9uZ2ludCk7DQ0KICAgICAgICAgIHByb2NlZHVy
ZSBhdGluc2VydChpbmRleCA6IGxvbmdpbnQ7aXRlbSA6IHBvaW50ZXIpOw0N
CiAgICAgICAgICBwcm9jZWR1cmUgYXRwdXQoaW5kZXggOiBsb25naW50O2l0
ZW0gOiBwb2ludGVyKTsNDQogICAgICAgICAgcHJvY2VkdXJlIGRlbGV0ZShp
dGVtIDogcG9pbnRlcik7DQ0KICAgICAgICAgIHByb2NlZHVyZSBkZWxldGVh
bGw7DQ0KICAgICAgICAgIHByb2NlZHVyZSBlcnJvcihjb2RlLGluZm8gOiBs
b25naW50KTt2aXJ0dWFsOw0NCiAgICAgICAgICBmdW5jdGlvbiBmaXJzdHRo
YXQodGVzdCA6IHBvaW50ZXIpIDogcG9pbnRlcjsNDQogICAgICAgICAgcHJv
Y2VkdXJlIGZvcmVhY2goYWN0aW9uIDogcG9pbnRlcik7DQ0KICAgICAgICAg
IHByb2NlZHVyZSBmcmVlKGl0ZW0gOiBwb2ludGVyKTsNDQogICAgICAgICAg
cHJvY2VkdXJlIGZyZWVhbGw7DQ0KICAgICAgICAgIHByb2NlZHVyZSBmcmVl
aXRlbShpdGVtIDogcG9pbnRlcik7dmlydHVhbDsNDQogICAgICAgICAgZnVu
Y3Rpb24gZ2V0aXRlbSh2YXIgcyA6IHRzdHJlYW0pIDogcG9pbnRlcjt2aXJ0
dWFsOw0NCiAgICAgICAgICBmdW5jdGlvbiBpbmRleG9mKGl0ZW0gOiBwb2lu
dGVyKSA6IGxvbmdpbnQ7dmlydHVhbDsNDQogICAgICAgICAgcHJvY2VkdXJl
IGluc2VydChpdGVtIDogcG9pbnRlcik7dmlydHVhbDsNDQogICAgICAgICAg
ZnVuY3Rpb24gbGFzdHRoYXQodGVzdCA6IHBvaW50ZXIpIDogcG9pbnRlcjsN
DQogICAgICAgICAgcHJvY2VkdXJlIHBhY2s7DQ0KICAgICAgICAgIHByb2Nl
ZHVyZSBwdXRpdGVtKHZhciBzIDogdHN0cmVhbTtpdGVtIDogcG9pbnRlcik7
dmlydHVhbDsNDQogICAgICAgICAgcHJvY2VkdXJlIHNldGxpbWl0KGFsaW1p
dCA6IGxvbmdpbnQpO3ZpcnR1YWw7DQ0KICAgICAgICAgIHByb2NlZHVyZSBz
dG9yZSh2YXIgcyA6IHRzdHJlYW0pOw0NCiAgICAgICBlbmQ7DQ0KDQ0KICAg
IHBzb3J0ZWRjb2xsZWN0aW9uID0gXnRzb3J0ZWRjb2xsZWN0aW9uOw0NCg0N
CiAgICB0c29ydGVkY29sbGVjdGlvbiA9IG9iamVjdCh0Y29sbGVjdGlvbikN
DQogICAgICAgZHVwbGljYXRlcyA6IGJvb2xlYW47DQ0KICAgICAgIGNvbnN0
cnVjdG9yIGxvYWQodmFyIHMgOiB0c3RyZWFtKTsNDQogICAgICAgZnVuY3Rp
b24gY29tcGFyZShrZXkxLGtleTIgOiBwb2ludGVyKSA6IGludGVnZXI7dmly
dHVhbDsNDQogICAgICAgZnVuY3Rpb24gaW5kZXhvZihpdGVtIDogcG9pbnRl
cikgOiBsb25naW50O3ZpcnR1YWw7DQ0KICAgICAgIHByb2NlZHVyZSBpbnNl
cnQoaXRlbSA6IHBvaW50ZXIpO3ZpcnR1YWw7DQ0KICAgICAgIGZ1bmN0aW9u
IGtleW9mKGl0ZW0gOiBwb2ludGVyKSA6IHBvaW50ZXI7dmlydHVhbDsNDQog
ICAgICAgZnVuY3Rpb24gc2VhcmNoKGtleSA6IHBvaW50ZXI7dmFyIGluZGV4
IDogbG9uZ2ludCkgOiBib29sZWFuO3ZpcnR1YWw7DQ0KICAgICAgIHByb2Nl
ZHVyZSBzdG9yZSh2YXIgcyA6IHRzdHJlYW0pOw0NCiAgICBlbmQ7DQ0KDQ0K
ICAgIHBzdHJpbmdjb2xsZWN0aW9uID0gXnRzdHJpbmdjb2xsZWN0aW9uOw0N
Cg0NCiAgICB0c3RyaW5nY29sbGVjdGlvbiA9IG9iamVjdCh0c29ydGVkY29s
bGVjdGlvbikNDQogICAgICAgZnVuY3Rpb24gY29tcGFyZShrZXkxLGtleTIg
OiBwb2ludGVyKSA6IGludGVnZXI7dmlydHVhbDsNDQogICAgICAgcHJvY2Vk
dXJlIGZyZWVpdGVtKGl0ZW0gOiBwb2ludGVyKTt2aXJ0dWFsOw0NCiAgICAg
ICBmdW5jdGlvbiBnZXRpdGVtKHZhciBzIDogdHN0cmVhbSkgOiBwb2ludGVy
O3ZpcnR1YWw7DQ0KICAgICAgIHByb2NlZHVyZSBwdXRpdGVtKHZhciBzIDog
dHN0cmVhbTtpdGVtIDogcG9pbnRlcik7dmlydHVhbDsNDQogICAgZW5kOw0N
Cg0NCiAgICBwcmVzb3VyY2Vjb2xsZWN0aW9uID0gXnRyZXNvdXJjZWNvbGxl
Y3Rpb247DQ0KDQ0KICAgIHRyZXNvdXJjZWNvbGxlY3Rpb24gPSBvYmplY3Qo
dHN0cmluZ2NvbGxlY3Rpb24pDQ0KICAgICAgIHByb2NlZHVyZSBmcmVlaXRl
bShpdGVtIDogcG9pbnRlcik7dmlydHVhbDsNDQogICAgICAgZnVuY3Rpb24g
Z2V0aXRlbSh2YXIgcyA6IHRzdHJlYW0pIDogcG9pbnRlcjt2aXJ0dWFsOw0N
CiAgICAgICBmdW5jdGlvbiBrZXlvZihpdGVtIDogcG9pbnRlcikgOiBwb2lu
dGVyO3ZpcnR1YWw7DQ0KICAgICAgIHByb2NlZHVyZSBwdXRpdGVtKHZhciBz
IDogdHN0cmVhbTtpdGVtIDogcG9pbnRlcik7dmlydHVhbDsNDQogICAgZW5k
Ow0NCg0NCiAgICB7IG9ubHkgZm9yIGNvbXBhdGliYWxpdHksIHdlIGRvIHRo
aXMgaW4gYW4gb3RoZXIgd2F5IC4uLiB9DQ0KDQ0KICAgIHRzdHJpbmRleHJl
YyA9IHJlY29yZA0NCiAgICAgICBrZXksY291bnQsb2Zmc2V0IDogbG9uZ2lu
dDsNDQogICAgZW5kOw0NCg0NCiAgICB0c3RyaW5kZXggPSBhcnJheVswLi45
OTk5XSBvZiB0c3RyaW5kZXhyZWM7DQ0KICAgIHBzdHJpbmRleCA9IF50c3Ry
aW5kZXg7DQ0KDQ0KICAgIHsgLi4uIHdlIHVzZSBhIHRyZWUsIHRoaXMgbmVl
ZHMgbW9yZSBtZW1vcnkgfQ0NCiAgICB7IHRoaXMgZnJhZ21lbnRzIHRoZSBo
ZWFwLCBidXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIH0NDQogICAgeyBhbmQg
aXQncyB2ZXJ5IGZsZXhpYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB9DQ0KICAgIHBzdHJpbmRleG5vZGUgPSBedHN0cmluZGV4bm9kZTsNDQoN
DQogICAgdHN0cmluZGV4bm9kZSA9IHJlY29yZA0NCiAgICAgICBzIDogcHN0
cmluZzsNDQogICAgICAga2V5IDogbG9uZ2ludDsNDQogICAgICAgbGVmdCxy
aWdodCA6IHBzdHJpbmRleG5vZGU7DQ0KICAgIGVuZDsNDQoNDQogICAgcHN0
cmluZ2xpc3QgPSBedHN0cmluZ2xpc3Q7DQ0KICAgIHRzdHJpbmdsaXN0ID0g
b2JqZWN0KHRvYmplY3QpDQ0KICAgICAgIHJvb3QgOiBwc3RyaW5kZXhub2Rl
Ow0NCiAgICAgICBjb25zdHJ1Y3RvciBsb2FkKHZhciBzIDogdHN0cmVhbSk7
DQ0KICAgICAgIGNvbnN0cnVjdG9yIGluaXQoYXN0cnNpemUsYWluZGV4c2l6
ZSA6IGxvbmdpbnQpOw0NCiAgICAgICBkZXN0cnVjdG9yIGRvbmU7dmlydHVh
bDsNDQogICAgICAgZnVuY3Rpb24gZ2V0KGtleSA6IGxvbmdpbnQpIDogc3Ry
aW5nOw0NCiAgICAgICBwcm9jZWR1cmUgcHV0KGtleSA6IGxvbmdpbnQ7c3Ry
IDogcHN0cmluZyk7DQ0KICAgICAgIHByb2NlZHVyZSBwdXQoa2V5IDogbG9u
Z2ludDtjb25zdCBzIDogc3RyaW5nKTsNDQogICAgICAgcHJvY2VkdXJlIHN0
b3JlKHZhciBzIDogdHN0cmVhbSk7DQ0KICAgIGVuZDsNDQoNDQogICAgeyBm
b3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB9DQ0KICAgIHBzdHJsaXN0bWFr
ZXIgPSBwc3RyaW5nbGlzdDsNDQogICAgdHN0cmxpc3RtYWtlciA9IHRzdHJp
bmdsaXN0Ow0NCg0NCiAgICBwcm9jZWR1cmUgcmVnaXN0ZXJ0eXBlKHZhciBz
IDogdHN0cmVhbXJlYyk7ICAgICAgIA0NCiAgICBwcm9jZWR1cmUgcmVnaXN0
ZXJvYmplY3RzOw0NCg0NCiAgICBmdW5jdGlvbiBuZXdzdHIoY29uc3QgcyA6
IHN0cmluZykgOiBwc3RyaW5nOw0NCiAgICBwcm9jZWR1cmUgZGlzcG9zZXN0
cihwIDogcHN0cmluZyk7DQ0KICAgICAgIA0NCiAgICBmdW5jdGlvbiBsb25n
bXVsKHgseSA6IGxvbmdpbnQpIDogbG9uZ2ludDsNDQogICAgZnVuY3Rpb24g
bG9uZ2Rpdih4LHkgOiBsb25naW50KSA6IGxvbmdpbnQ7DQ0KICAgIA0NCiAg
ICBwcm9jZWR1cmUgYWJzdHJhY3Q7DQ0KICAgIA0NCiAgICBjb25zdA0NCiAg
ICAgICB7IHN0cmVhbSBjb25zdHMgfQ0NCiAgICAgICBzdGNyZWF0ZSA9ICQz
YzAwOw0NCiAgICAgICBzdG9wZW5yZWFkID0gJDNkMDA7DQ0KICAgICAgIHN0
b3BlbndyaXRlID0gJDNkMDE7DQ0KICAgICAgIHN0b3BlbiA9ICQzZDAyOw0N
CiAgICAgICANDQogICAgICAgc3RvayA9IDA7DQ0KICAgICAgIHN0ZXJyb3Ig
PSAtMTsNDQogICAgICAgc3Rpbml0ZXJyb3IgPSAtMjsNDQogICAgICAgc3Ry
ZWFkZXJyb3IgPSAtMzsNDQogICAgICAgc3R3cml0ZWVycm9yID0gLTQ7DQ0K
ICAgICAgIHN0Z2V0ZXJyb3IgPSAtNTsNDQogICAgICAgc3RwdXRlcnJvciA9
IC02Ow0NCiAgICAgICANDQogICAgICAgeyBvbmx5IGZvciBiYWNrd2FyZCBj
b21wYXRpYmFsaXR5IH0NDQogICAgICAgZW1zY3VyaGFuZGxlIDogd29yZCA9
ICRmZmZmOw0NCiAgICAgICBlbXNjdXJwYWdlIDogd29yZCA9ICRmZmZmOw0N
Cg0NCiAgICAgICBzdHJlYW1lcnJvciA6IHBvaW50ZXIgPSBuaWw7DQ0KDQ0K
ICAgICAgIHJjb2xsZWN0aW9uIDogdHN0cmVhbXJlYyA9ICgNDQogICAgICAg
ICAgb2JqdHlwZSA6IDUwOw0NCiAgICAgICAgICB7ICEhISEhISENDQogICAg
ICAgICAgdm10bGluayA6IHR5cGVvZih0Y29sbGVjdGlvbikNDQogICAgICAg
ICAgbG9hZCA6IEB0Y29sbGVjdGlvbi5sb2FkOw0NCiAgICAgICAgICBzdG9y
ZSA6IEB0Y29sbGVjdGlvbi5zdG9yZTsNDQogICAgICAgICAgbmV4dCA6IHBv
aW50ZXI7DQ0KDQ0KICAgICAgICAgIH0NDQogICAgICAgKTsNDQoNDQogICAg
ICAgcnN0cmluZ2NvbGxlY3Rpb24gOiB0c3RyZWFtcmVjID0gKA0NCiAgICAg
ICAgICBvYmp0eXBlIDogNTE7DQ0KICAgICAgICAgIHshISEhISEhfQ0NCiAg
ICAgICApOw0NCg0NCiAgICAgICByc3RyaW5nbGlzdCA6IHRzdHJlYW1yZWMg
PSAoDQ0KICAgICAgICAgIG9ianR5cGUgOiA1MjsNDQogICAgICAgICAgeyEh
ISEhISF9DQ0KICAgICAgICk7DQ0KDQ0KICAgICAgIHJzdHJsaXN0bWFrZXIg
OiB0c3RyZWFtcmVjID0gKA0NCiAgICAgICAgICBvYmp0eXBlIDogNTI7DQ0K
ICAgICAgICAgIHshISEhISEhfQ0NCiAgICAgICApOw0NCg0NCiAgaW1wbGVt
ZW50YXRpb24NDQoNDQogICAgY29uc3QNDQogICAgICAgc3RyZWFtcmVjcyA6
IHBzdHJlYW1yZWMgPSBuaWw7DQ0KDQ0KICAgIHByb2NlZHVyZSByZWdpc3Rl
cnR5cGUodmFyIHMgOiB0c3RyZWFtcmVjKTsNDQoNDQogICAgICAgYmVnaW4N
DQogICAgICAgICAgcy5uZXh0Oj1zdHJlYW1yZWNzOw0NCiAgICAgICAgICAN
DQogICAgICAgICAgeyBiZXR0ZXIgZG8gYSB0eXBlIGNvbnZlcnNhdGlvbiB9
DQ0KICAgICAgICAgIHN0cmVhbXJlY3M6PXBzdHJlYW1yZWMoQHMpOw0NCiAg
ICAgICBlbmQ7DQ0KICAgICAgIA0NCiAgICBwcm9jZWR1cmUgcmVnaXN0ZXJv
YmplY3RzOw0NCiAgICAgDQ0KICAgICAgIGJlZ2luDQ0KICAgICAgICAgIHJl
Z2lzdGVydHlwZShyY29sbGVjdGlvbik7DQ0KICAgICAgICAgIHJlZ2lzdGVy
dHlwZShyc3RyaW5nY29sbGVjdGlvbik7DQ0KICAgICAgICAgIHJlZ2lzdGVy
dHlwZShyc3RyaW5nbGlzdCk7DQ0KICAgICAgICAgIHJlZ2lzdGVydHlwZShy
c3RybGlzdG1ha2VyKTsNDQogICAgICAgZW5kOw0NCiAgICAgICANDQogICAg
cHJvY2VkdXJlIGFic3RyYWN0Ow0NCiAgICANDQogICAgICBiZWdpbg0NCiAg
ICAgICAgIHJ1bmVycm9yKDIxMSk7DQ0KICAgICAgZW5kOw0NCg0NCiAgICBm
dW5jdGlvbiBuZXdzdHIoY29uc3QgcyA6IHN0cmluZykgOiBwc3RyaW5nOw0N
CiAgICANDQogICAgICB2YXINDQogICAgICAgICBwIDogcHN0cmluZzsNDQoN
DQogICAgICBiZWdpbg0NCiAgICAgICAgIGdldG1lbShwLGxlbmd0aChzKSsx
KTsNDQogICAgICAgICBwXjo9czsNDQogICAgICAgICBuZXdzdHI6PXA7DQ0K
ICAgICAgZW5kOw0NCiAgICAgIA0NCiAgICBwcm9jZWR1cmUgZGlzcG9zZXN0
cihwIDogcHN0cmluZyk7DQ0KICAgIA0NCiAgICAgIGJlZ2luDQ0KICAgICAg
ICAgaWYgYXNzaWduZWQocCkgdGhlbg0NCiAgICAgICAgICAgZnJlZW1lbShw
LGxlbmd0aChwXikrMSk7DQ0KICAgICAgZW5kOw0NCg0NCiAgICBmdW5jdGlv
biBsb25nbXVsKHgseSA6IGxvbmdpbnQpIDogbG9uZ2ludDsNDQoNDQogICAg
ICBiZWdpbg0NCiAgICAgICAgIGV4aXQoeCp5KTsNDQogICAgICBlbmQ7DQ0K
ICAgICAgDQ0KICAgIGZ1bmN0aW9uIGxvbmdkaXYoeCx5IDogbG9uZ2ludCkg
OiBsb25naW50Ow0NCiAgICANDQogICAgICBiZWdpbg0NCiAgICAgICAgIGV4
aXQoeCBkaXYgeSk7DQ0KICAgICAgZW5kOw0NCiAgICAgIA0NCnsqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqDQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgVFJFQ1QNDQogKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKn0NDQoNDQogICAgcHJvY2VkdXJlIHRyZWN0LmNoZWNrZW1w
dHk7DQ0KDQ0KICAgICAgYmVnaW4NDQogICAgICAgICBpZiAoYS54PmIueCkg
b3IgKGEueT5iLnkpIHRoZW4NDQogICAgICAgICAgIGJlZ2luDQ0KICAgICAg
ICAgICAgICBhLng6PTA7DQ0KICAgICAgICAgICAgICBhLnk6PTA7DQ0KICAg
ICAgICAgICAgICBiLng6PTA7DQ0KICAgICAgICAgICAgICBiLnk6PTA7DQ0K
ICAgICAgICAgIGVuZDsNDQogICAgICBlbmQ7DQ0KDQ0KICAgIHByb2NlZHVy
ZSB0cmVjdC5hc3NpZ24oeGEseWEseGIseWIgOiBsb25naW50KTsNDQoNDQog
ICAgICBiZWdpbg0NCiAgICAgICAgIGEueDo9eGE7DQ0KICAgICAgICAgYS55
Oj15YTsNDQogICAgICAgICBiLng6PXhiOw0NCiAgICAgICAgIGIueTo9eWI7
DQ0KICAgICAgZW5kOw0NCg0NCiAgICBwcm9jZWR1cmUgdHJlY3QuY29weShy
IDogdHJlY3QpOw0NCg0NCiAgICAgIGJlZ2luDQ0KICAgICAgICAgYTo9ci5h
Ow0NCiAgICAgICAgIGI6PXIuYjsNDQogICAgICBlbmQ7DQ0KDQ0KICAgIHBy
b2NlZHVyZSB0cmVjdC5tb3ZlKGFkeCxhZHkgOiBsb25naW50KTsNDQoNDQog
ICAgICBiZWdpbg0NCiAgICAgICAgIGluYyhhLngsYWR4KTsNDQogICAgICAg
ICBpbmMoYS55LGFkeSk7DQ0KICAgICAgICAgaW5jKGIueCxhZHgpOw0NCiAg
ICAgICAgIGluYyhiLnksYWR5KTsNDQogICAgICBlbmQ7DQ0KDQ0KICAgIHBy
b2NlZHVyZSB0cmVjdC5ncm93KGFkeCxhZHkgOiBsb25naW50KTsNDQoNDQog
ICAgICBiZWdpbg0NCiAgICAgICAgIGRlYyhhLngsYWR4KTsNDQogICAgICAg
ICBkZWMoYS55LGFkeSk7DQ0KICAgICAgICAgaW5jKGIueCxhZHgpOw0NCiAg
ICAgICAgIGluYyhiLnksYWR5KTsNDQogICAgICAgICBjaGVja2VtcHR5Ow0N
CiAgICAgIGVuZDsNDQoNDQogICAgcHJvY2VkdXJlIHRyZWN0LmludGVyc2Vj
dChyIDogdHJlY3QpOw0NCg0NCiAgICAgIGJlZ2luDQ0KICAgICAgICAgaWYg
ci5hLng+YS54IHRoZW4NDQogICAgICAgICAgIGEueDo9ci5hLng7DQ0KICAg
ICAgICAgaWYgci5hLnk+YS55IHRoZW4NDQogICAgICAgICAgIGEueTo9ci5h
Lnk7DQ0KICAgICAgICAgaWYgci5iLng8PWIueCB0aGVuDQ0KICAgICAgICAg
ICBiLng6PXIuYi54Ow0NCiAgICAgICAgIGlmIHIuYi55PD1iLnkgdGhlbg0N
CiAgICAgICAgICAgYi55Oj1yLmIueTsNDQogICAgICAgICBjaGVja2VtcHR5
Ow0NCiAgICAgIGVuZDsNDQoNDQogICAgcHJvY2VkdXJlIHRyZWN0LnVuaW9u
KHIgOiB0cmVjdCk7DQ0KDQ0KICAgICAgYmVnaW4NDQogICAgICAgICBpZiBy
LmEueDxhLnggdGhlbg0NCiAgICAgICAgICAgYS54Oj1yLmEueDsNDQogICAg
ICAgICBpZiByLmEueTxhLnkgdGhlbg0NCiAgICAgICAgICAgYS55Oj1yLmEu
eTsNDQogICAgICAgICBpZiByLmIueD5iLnggdGhlbg0NCiAgICAgICAgICAg
Yi54Oj1yLmIueDsNDQogICAgICAgICBpZiByLmIueT5iLnkgdGhlbg0NCiAg
ICAgICAgICAgYi55Oj1yLmIueTsNDQogICAgICBlbmQ7DQ0KDQ0KICAgIGZ1
bmN0aW9uIHRyZWN0LmNvbnRhaW5zKHA6IHRwb2ludCkgOiBib29sZWFuOw0N
Cg0NCiAgICAgIGJlZ2luDQ0KICAgICAgICAgY29udGFpbnM6PShwLng+PWEu
eCkgYW5kIChwLng8PWIueCkgYW5kIChwLnk+PWEueSkgYW5kIChwLnk8PWIu
eSk7DQ0KICAgICAgZW5kOw0NCg0NCiAgICBmdW5jdGlvbiB0cmVjdC5lcXVh
bHMociA6IHRyZWN0KSA6ICBib29sZWFuOw0NCg0NCiAgICAgIGJlZ2luDQ0K
ICAgICAgICAgZXF1YWxzOj0oYS54PXIuYS54KSBhbmQgKGEueT1yLmEueSkg
YW5kIChiLng9ci5iLngpIGFuZCAoYi55PXIuYi55KTsNDQogICAgICBlbmQ7
DQ0KDQ0KICAgIGZ1bmN0aW9uIHRyZWN0LmVtcHR5IDogYm9vbGVhbjsNDQoN
DQogICAgICBiZWdpbg0NCiAgICAgICAgIGVtcHR5Oj0oYS54PWIueCkgYW5k
IChhLnk9Yi55KTsNDQogICAgICBlbmQ7DQ0KDQ0KeyoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioNDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBUT0JKRUNUDQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKip9DQ0KDQ0KICAgIGNvbnN0cnVjdG9yIHRvYmplY3QuaW5pdDsNDQoN
DQogICAgICBiZWdpbg0NCiAgICAgICAgIHsgaW5pdCBtZW0gfQ0NCiAgICAg
ICAgIGZpbGxjaGFyKChAc2VsZis0KV4sc2l6ZW9mKHNlbGYpLTQsMCk7DQ0K
ICAgICAgZW5kOw0NCiAgICAgIA0NCiAgICBkZXN0cnVjdG9yIHRvYmplY3Qu
ZG9uZTsNDQogICAgDQ0KICAgICAgYmVnaW4NDQogICAgICBlbmQ7DQ0KICAg
ICAgDQ0KICAgIHByb2NlZHVyZSB0b2JqZWN0LmZyZWU7DQ0KICAgIA0NCiAg
ICAgIGJlZ2luDQ0KICAgICAgICAgeyBzdHVwaWQ6IH0NDQogICAgICAgICBk
aXNwb3NlKEBzZWxmLGRvbmUpOw0NCiAgICAgICAgIHsgKGFuZCBnZW5lcmF0
ZXMgc3R1cGlkIGNvZGUpIH0NDQogICAgICBlbmQ7DQ0KDQ0KeyoqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioNDQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgVFNUUkVBTQ0NCiAqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqfQ0NCg0NCiAgICBwcm9jZWR1cmUgdHN0cmVhbS5jb3B5ZnJv
bSh2YXIgcyA6IHRzdHJlYW07Y291bnQgOiBsb25naW50KTsNDQoNDQogICAg
ICB2YXINDQogICAgICAgICBvbGRwb3MgOiBsb25naW50Ow0NCiAgICAgICAg
IHAgOiBwYnl0ZWFycmF5Ow0NCg0NCiAgICAgIGJlZ2luDQ0KICAgICAgICAg
aWYgc3RhdHVzPD5zdG9rIHRoZW4NDQogICAgICAgICAgIGV4aXQ7DQ0KDQ0K
ICAgICAgICAgeyBhbGxvYyB0aGUgYnVmZmVyIH0NDQogICAgICAgICB7IG1h
eSBiZSB0aGlzIGRlZnJhZ21lbnRzIHRoZSBoZWFwIH0NDQogICAgICAgICBn
ZXRtZW0ocCxjb3VudCk7DQ0KDQ0KICAgICAgICAgeyBkb24ndCBtb2RpZnkg
dGhlIHNvdXJjZSBzdHJlYW0gfQ0NCiAgICAgICAgIHsgcmVhbGx5ID8/IH0N
DQogICAgICAgICBvbGRwb3M6PXMuZ2V0cG9zOw0NCiAgICAgICAgIHMucmVh
ZChwXixjb3VudCk7DQ0KICAgICAgICAgcy5zZWVrKG9sZHBvcyk7DQ0KICAg
ICAgICAgaWYgcy5zdGF0dXM9c3RvayB0aGVuDQ0KICAgICAgICAgICB3cml0
ZShwXixjb3VudCkNDQogICAgICAgICBlbHNlDQ0KICAgICAgICAgICBlcnJv
cihzdGVycm9yLHMuc3RhdHVzKTsNDQogICAgICAgICBmcmVlbWVtKHAsY291
bnQpOw0NCiAgICAgIGVuZDsNDQogICAgDQ0KICAgIHByb2NlZHVyZSB0c3Ry
ZWFtLmVycm9yKGNvZGUsaW5mbyA6IGxvbmdpbnQpOw0NCiAgICANDQogICAg
ICB0eXBlDQ0KICAgICAgICAgdHN0cmVhbWVycm9ycHJvYyA9IHByb2NlZHVy
ZTsNDQogICAgDQ0KICAgICAgYmVnaW4NDQogICAgICAgICBzdGF0dXM6PWNv
ZGU7DQ0KICAgICAgICAgZXJyb3JpbmZvOj1pbmZvOw0NCiAgICAgICAgIGlm
IGFzc2lnbmVkKHN0cmVhbWVycm9yKSB0aGVuDQ0KICAgICAgICAgICBiZWdp
bg0NCiAgICAgICAgICAgICAgdHN0cmVhbWVycm9ycHJvYyhzdHJlYW1lcnJv
cikoKTsNDQogICAgICAgICAgIGVuZDsNDQogICAgICBlbmQ7DQ0KICAgICAg
DQ0KICAgIHByb2NlZHVyZSB0c3RyZWFtLmZsdXNoOw0NCg0NCiAgICAgIGJl
Z2luDQ0KICAgICAgICAgYWJzdHJhY3Q7DQ0KICAgICAgZW5kOw0NCg0NCiAg
ICBmdW5jdGlvbiBsb2FkbWV0aG9kKGNvbnMsdm10X2xpbmssc3RyZWFtIDog
cG9pbnRlcikgOiBwb2JqZWN0Ow0NCg0NCiAgICAgIGJlZ2luDQ0KICAgICAg
ICAgYXNtDQ0KICAgICAgICAgICAgLy8gcHVzaCBzdHJlYW0gdmFyDQ0KICAg
ICAgICAgICAgcHVzaGwgMTYoJWVicCkNDQogICAgICAgICAgICAvLyBjYWxs
IGdldCBtZW0NDQogICAgICAgICAgICBwdXNobCAkMA0NCiAgICAgICAgICAg
IC8vIHZtdCBsaW5rDQ0KICAgICAgICAgICAgcHVzaGwgMTIoJWVicCkNDQog
ICAgICAgICAgICAvLyBkbyBjYWxsDQ0KICAgICAgICAgICAgbW92bCAlZWF4
LDgoJWVicCkNDQogICAgICAgICAgICBjYWxsICglZWF4KQ0NCiAgICAgICAg
ICAgIG1vdmwgJWVzaSwlZWF4DQ0KICAgICAgICAgICAgbGVhdmUNDQogICAg
ICAgICAgICByZXQgJDEyDQ0KICAgICAgICAgZW5kOw0NCiAgICAgIGVuZDsN
DQoNDQogICAgZnVuY3Rpb24gdHN0cmVhbS5nZXQgOiBwb2JqZWN0Ow0NCiAg
ICANDQogICAgICB2YXINDQogICAgICAgICBsIDogbG9uZ2ludDsNDQogICAg
ICAgICBocCA6IHBzdHJlYW1yZWM7DQ0KICAgICAgICAgcCA6IHBvYmplY3Q7
DQ0KICAgICAgICAgDQ0KICAgICAgYmVnaW4NDQogICAgICAgICBpZiBzdGF0
dXM8PnN0b2sgdGhlbg0NCiAgICAgICAgICAgZXhpdDsgICAgICANDQogICAg
ICAgICByZWFkKGwsNCk7DQ0KICAgICAgICAgaWYgc3RhdHVzPD5zdG9rIHRo
ZW4NDQogICAgICAgICAgIGV4aXQ7DQ0KICAgICAgICAgaWYgbD0wIHRoZW4N
DQogICAgICAgICAgIGV4aXQobmlsKTsNDQogICAgICAgICBocDo9c3RyZWFt
cmVjczsNDQogICAgICAgICB3aGlsZSBocF4ub2JqdHlwZTw+bCBkbw0NCiAg
ICAgICAgICAgYmVnaW4NDQogICAgICAgICAgICAgIGlmIGhwPW5pbCB0aGVu
DQ0KICAgICAgICAgICAgICAgIGJlZ2luDQ0KICAgICAgICAgICAgICAgICAg
IGVycm9yKHN0Z2V0ZXJyb3IsbCk7DQ0KICAgICAgICAgICAgICAgICAgIGV4
aXQobmlsKTsNDQogICAgICAgICAgICAgICAgZW5kOw0NCiAgICAgICAgICAg
ICAgaHA6PWhwXi5uZXh0Ow0NCiAgICAgICAgICAgZW5kOw0NCiAgICAgICAg
IHsgbG9hZCBvYmplY3QgfQ0NCiAgICAgICAgIGdldDo9bG9hZG1ldGhvZCho
cF4ubG9hZCxocF4udm10bGluayxAc2VsZik7DQ0KICAgICAgZW5kOw0NCiAg
ICANDQogICAgZnVuY3Rpb24gdHN0cmVhbS5nZXRwb3MgOiBsb25naW50Ow0N
CiAgICANDQogICAgICBiZWdpbg0NCiAgICAgICAgIGFic3RyYWN0Ow0NCiAg
ICAgIGVuZDsNDQogICAgDQ0KICAgIGZ1bmN0aW9uIHRzdHJlYW0uZ2V0c2l6
ZSA6IGxvbmdpbnQ7DQ0KICAgIA0NCiAgICAgIGJlZ2luDQ0KICAgICAgICAg
YWJzdHJhY3Q7DQ0KICAgICAgZW5kOw0NCg0NCiAgICB0eXBlDQ0KICAgICAg
IHRzdG9yZW1ldGhvZCA9IHByb2NlZHVyZShfc2VsZiA6IHBvaW50ZXI7X3N0
cmVhbSA6IHBvaW50ZXIpOw0NCiAgICANDQogICAgcHJvY2VkdXJlIHRzdHJl
YW0ucHV0KHAgOiBwb2JqZWN0KTsNDQoNDQogICAgICB2YXINDQogICAgICAg
ICBocCA6IHBzdHJlYW1yZWM7DQ0KICAgICAgICAgbCA6IGxvbmdpbnQ7DQ0K
ICAgIA0NCiAgICAgIGJlZ2luDQ0KICAgICAgICAgaWYgc3RhdHVzPD5zdG9r
IHRoZW4NDQogICAgICAgICAgIGV4aXQ7DQ0KICAgICAgICAgICANDQogICAg
ICAgICB7IG1heSBiZSB3cml0ZSBuaWwgfQ0NCiAgICAgICAgIGlmIHA9bmls
IHRoZW4NDQogICAgICAgICAgIGJlZ2luDQ0KICAgICAgICAgICAgICBsOj0w
Ow0NCiAgICAgICAgICAgICAgd3JpdGUobCw0KTsNDQogICAgICAgICAgICAg
IGV4aXQ7DQ0KICAgICAgICAgICBlbmQ7DQ0KICAgICAgICAgeyBzZWFyY2gg
b2JqZWN0IHJlZ2lzdHJhdGlvbiB9ICAgICAgICAgICANDQogICAgCSBocDo9
c3RyZWFtcmVjczsNDQogICAgICAgICB3aGlsZSBocF4udm10bGluazw+dHlw
ZW9mKHBeKSBkbw0NCiAgICAgICAgICAgYmVnaW4NDQogICAgICAgICAgICAg
IGlmIGhwPW5pbCB0aGVuDQ0KICAgICAgICAgICAgICAgIGJlZ2luDQ0KICAg
ICAgICAgICAgICAgICAgIGVycm9yKHN0cHV0ZXJyb3IsbG9uZ2ludCh0eXBl
b2YocF4pKSk7DQ0KICAgICAgICAgICAgICAgICAgIGV4aXQ7DQ0KICAgICAg
ICAgICAgICAgIGVuZDsNDQogICAgICAgICAgICAgIGhwOj1ocF4ubmV4dDsN
DQogICAgICAgICAgIGVuZDsNDQogICAgICAgICB3cml0ZShocF4ub2JqdHlw
ZSw0KTsNDQogICAgICAgICBpZiBzdGF0dXM8PnN0b2sgdGhlbg0NCiAgICAg
ICAgICAgZXhpdDsNDQoNDQogICAgICAgICB7IHlvdSBjYW4gY2FsbCBhIG1l
dGhvZCBleHBsaWNpdCB0b28gfQ0NCiAgICAgICAgIHRzdG9yZW1ldGhvZCho
cF4uc3RvcmUpKHAsQHNlbGYpOw0NCiAgICAgIGVuZDsNDQogICAgDQ0KICAg
IHByb2NlZHVyZSB0c3RyZWFtLnJlYWQodmFyIGJ1Zjtjb3VudCA6IGxvbmdp
bnQpOw0NCiAgICANDQogICAgICBiZWdpbg0NCiAgICAgICAgIGFic3RyYWN0
Ow0NCiAgICAgIGVuZDsNDQogICAgDQ0KICAgIGZ1bmN0aW9uIHRzdHJlYW0u
cmVhZHN0ciA6IHBzdHJpbmc7DQ0KDQ0KeyRpZmRlZiBTU1RSSU5HfQ0NCiAg
ICAgIHZhcg0NCiAgICAgICAgIGxlbiA6IGJ5dGU7DQ0KeyRlbmRpZn0NDQog
ICAgICAgICBwIDogcHN0cmluZzsNDQoNDQogICAgICBiZWdpbg0NCiAgICAg
ICAgIGlmIHN0YXR1czw+c3RvayB0aGVuDQ0KICAgICAgICAgICBleGl0Ow0N
CiAgICAgICAgIHJlYWQobGVuLDEpOw0NCiAgICAgICAgIGdldG1lbShwLGxl
bisxKTsNDQogICAgICAgICBsZW5ndGgocF4pOj1sZW47DQ0KICAgICAgICAg
cmVhZCgocCsxKV4sbGVuKTsNDQogICAgICAgICByZWFkc3RyOj1wOw0NCiAg
ICAgIGVuZDsNDQogICAgICANDQogICAgcHJvY2VkdXJlIHRzdHJlYW0ucmVz
ZXQ7DQ0KICAgIA0NCiAgICAgIGJlZ2luDQ0KICAgICAgICAgc3RhdHVzOj1z
dG9rOw0NCiAgICAgICAgIGVycm9yaW5mbzo9MDsNDQogICAgIGVuZDsNDQog
ICAgIA0NCiAgICBwcm9jZWR1cmUgdHN0cmVhbS5zZWVrKHBvcyA6IGxvbmdp
bnQpOw0NCiAgICANDQogICAgICBiZWdpbg0NCiAgICAgICAgIGFic3RyYWN0
Ow0NCiAgICAgIGVuZDsNDQogICAgDQ0KICAgIHByb2NlZHVyZSB0c3RyZWFt
LnRydW5jYXRlOw0NCiAgICANDQogICAgICBiZWdpbg0NCiAgICAgICAgIGFi
c3RyYWN0Ow0NCiAgICAgIGVuZDsNDQogICAgDQ0KICAgIHByb2NlZHVyZSB0
c3RyZWFtLndyaXRlKHZhciBidWY7Y291bnQgOiBsb25naW50KTsNDQoNDQog
ICAgICBiZWdpbg0NCiAgICAgICAgIGFic3RyYWN0Ow0NCiAgICAgIGVuZDsN
DQogICAgDQ0KICAgIHByb2NlZHVyZSB0c3RyZWFtLndyaXRlc3RyKHAgOiBw
c3RyaW5nKTsNDQogICAgDQ0KICAgICAgYmVnaW4NDQogICAgICAgICBpZiBz
dGF0dXM8PnN0b2sgdGhlbg0NCiAgICAgICAgICAgZXhpdDsNDQogICAgICAg
ICB3cml0ZShwXixsZW5ndGgocF4pKzEpOw0NCiAgICAgIGVuZDsNDQoNDQp7
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0NCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBURE9TU1RSRUFNDQ0KICoqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKip9DQ0KDQ0KICAgIGNvbnN0cnVjdG9yIHRk
b3NzdHJlYW0uaW5pdChjb25zdCBmaWxlbmFtZSA6IGZuYW1lc3RyO21vZGUg
OiB3b3JkKTsNDQoNDQogICAgICBiZWdpbg0NCiAgICAgICAgIGluaGVyaXRl
ZCBpbml0Ow0NCiAgICAgICAgIHshISEhISEhfQ0NCiAgICAgIGVuZDsNDQoN
DQogICAgZGVzdHJ1Y3RvciB0ZG9zc3RyZWFtLmRvbmU7DQ0KDQ0KICAgICAg
YmVnaW4NDQogICAgICAgICB7ISEhISEhIX0NDQogICAgICAgICBpbmhlcml0
ZWQgZG9uZTsNDQogICAgICBlbmQ7DQ0KDQ0KICAgIGZ1bmN0aW9uIHRkb3Nz
dHJlYW0uZ2V0cG9zIDogbG9uZ2ludDsNDQoNDQogICAgICBiZWdpbg0NCiAg
ICAgICAgIHshISEhISEhfQ0NCiAgICAgIGVuZDsNDQoNDQogICAgZnVuY3Rp
b24gdGRvc3N0cmVhbS5nZXRzaXplIDogbG9uZ2ludDsNDQoNDQogICAgICBi
ZWdpbg0NCiAgICAgICAgIHshISEhISEhfQ0NCiAgICAgIGVuZDsNDQoNDQog
ICAgcHJvY2VkdXJlIHRkb3NzdHJlYW0ucmVhZCh2YXIgYnVmO2NvdW50IDog
bG9uZ2ludCk7DQ0KDQ0KICAgICAgYmVnaW4NDQogICAgICAgICB7ISEhISEh
IX0NDQogICAgICBlbmQ7DQ0KDQ0KICAgIHByb2NlZHVyZSB0ZG9zc3RyZWFt
LnNlZWsocG9zIDogbG9uZ2ludCk7DQ0KDQ0KICAgICAgYmVnaW4NDQogICAg
ICAgICB7ISEhISEhIX0NDQogICAgICBlbmQ7DQ0KDQ0KICAgIHByb2NlZHVy
ZSB0ZG9zc3RyZWFtLnRydW5jYXRlOw0NCg0NCiAgICAgIGJlZ2luDQ0KICAg
ICAgICAgeyEhISEhISF9DQ0KICAgICAgZW5kOw0NCg0NCiAgICBwcm9jZWR1
cmUgdGRvc3N0cmVhbS53cml0ZSh2YXIgYnVmO2NvdW50IDogbG9uZ2ludCk7
DQ0KDQ0KICAgICAgYmVnaW4NDQogICAgICAgICB7ISEhISEhIX0NDQogICAg
ICBlbmQ7DQ0KDQ0KeyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioN
DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENPTExFQ1RJT04N
DQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKn0NDQoNDQogICAg
IGNvbnN0cnVjdG9yIHRjb2xsZWN0aW9uLmluaXQoYWxpbWl0LGFkZWx0YSA6
IGxvbmdpbnQpOw0NCg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAgICBpbmhl
cml0ZWQgaW5pdDsNDQogICAgICAgICAgaWYgYWxpbWl0PDAgdGhlbg0NCiAg
ICAgICAgICAgIGVycm9yKGNvaW5kZXhlcnJvcixhbGltaXQpOw0NCiAgICAg
ICAgICB7IGluIG15IG9waW5pb24sIHRoaXMgdGVzdCBpcyBuZXZlciBuZWVk
IH0NDQogICAgICAgICAgaWYgYWxpbWl0Pm1heGNvbGxlY3Rpb25zaXplIHRo
ZW4NDQogICAgICAgICAgICBhbGltaXQ6PW1heGNvbGxlY3Rpb25zaXplOw0N
CiAgICAgICAgICBnZXRtZW0oaXRlbXMsYWxpbWl0KnNpemVvZihwb2ludGVy
KSk7DQ0KICAgICAgICAgIGNvdW50Oj0wOw0NCiAgICAgICAgICBsaW1pdDo9
YWxpbWl0Ow0NCiAgICAgICAgICBkZWx0YTo9YWRlbHRhOw0NCiAgICAgICBl
bmQ7DQ0KDQ0KICAgICBjb25zdHJ1Y3RvciB0Y29sbGVjdGlvbi5sb2FkKHZh
ciBzIDogdHN0cmVhbSk7DQ0KDQ0KICAgICAgIHZhcg0NCiAgICAgICAgICBp
IDogbG9uZ2ludDsNDQoNDQogICAgICAgYmVnaW4NDQogICAgICAgICAgcy5y
ZWFkKGNvdW50LHNpemVvZihjb3VudCkpOw0NCiAgICAgICAgICBzLnJlYWQo
bGltaXQsc2l6ZW9mKGxpbWl0KSk7DQ0KICAgICAgICAgIHMucmVhZChkZWx0
YSxzaXplb2YoZGVsdGEpKTsNDQogICAgICAgICAgZ2V0bWVtKGl0ZW1zLGxp
bWl0KnNpemVvZihwb2ludGVyKSk7DQ0KICAgICAgICAgIGZvciBpOj0wIHRv
IGNvdW50LTEgZG8NDQogICAgICAgICAgICBpdGVtc15baV06PWdldGl0ZW0o
cyk7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgIGRlc3RydWN0b3IgdGNvbGxl
Y3Rpb24uZG9uZTsNDQoNDQogICAgICAgYmVnaW4NDQogICAgICAgICAgZnJl
ZWFsbDsNDQogICAgICAgICAgZnJlZW1lbShpdGVtcyxsaW1pdCpzaXplb2Yo
cG9pbnRlcikpOw0NCiAgICAgICAgICBpbmhlcml0ZWQgZG9uZTsNDQogICAg
ICAgZW5kOw0NCg0NCiAgICAgZnVuY3Rpb24gdGNvbGxlY3Rpb24uYXQoaW5k
ZXggOiBsb25naW50KSA6IHBvaW50ZXI7DQ0KDQ0KICAgICAgIGJlZ2luDQ0K
ICAgICAgICAgIGlmIChpbmRleDwwKSBvciAoaW5kZXg+PWNvdW50KSB0aGVu
DQ0KICAgICAgICAgICAgYmVnaW4NDQogICAgICAgICAgICAgICBlcnJvcihj
b2luZGV4ZXJyb3IsaW5kZXgpOw0NCiAgICAgICAgICAgICAgIGF0Oj1uaWw7
DQ0KICAgICAgICAgICAgZW5kDQ0KICAgICAgICAgIGVsc2UNDQogICAgICAg
ICAgICBhdDo9aXRlbXNeW2luZGV4XTsNDQogICAgICAgZW5kOw0NCg0NCiAg
ICAgcHJvY2VkdXJlIHRjb2xsZWN0aW9uLmF0ZGVsZXRlKGluZGV4IDogbG9u
Z2ludCk7DQ0KDQ0KICAgICAgIGJlZ2luDQ0KICAgICAgICAgIGlmIChpbmRl
eDwwKSBvciAoaW5kZXg+PWNvdW50KSB0aGVuDQ0KICAgICAgICAgICAgZXJy
b3IoY29pbmRleGVycm9yLGluZGV4KQ0NCiAgICAgICAgICBlbHNlDQ0KICAg
ICAgICAgICAgYmVnaW4NDQogICAgICAgICAgICAgICB7IGRlbGV0ZSB0aGUg
aXRlbSAodGhlIG1lbW9yeSB0aGUgaXRlbSBvY2N1cGllcyBpc24ndCBmcmVl
ZCkgfQ0NCiAgICAgICAgICAgICAgIGRlYyhjb3VudCk7DQ0KICAgICAgICAg
ICAgICAgeyBzeXN0ZW0ubW92ZSB0ZXN0cyBmb3IgemVybyBjb3VudCB9DQ0K
ICAgICAgICAgICAgICAgbW92ZShpdGVtc15baW5kZXgrMV0saXRlbXNeW2lu
ZGV4XSwNDQogICAgICAgICAgICAgICAgIChjb3VudC1pbmRleCkqc2l6ZW9m
KHBvaW50ZXIpKTsNDQogICAgICAgICAgICBlbmQ7DQ0KICAgICAgIGVuZDsN
DQoNDQogICAgIHByb2NlZHVyZSB0Y29sbGVjdGlvbi5hdGZyZWUoaW5kZXgg
OiBsb25naW50KTsNDQoNDQogICAgICAgdmFyDQ0KICAgICAgICAgIHAgOiBw
b2ludGVyOw0NCg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAgICBwOj1hdChp
bmRleCk7DQ0KICAgICAgICAgIGlmIGFzc2lnbmVkKHApIHRoZW4NDQogICAg
ICAgICAgICBiZWdpbg0NCiAgICAgICAgICAgICAgIGF0ZGVsZXRlKGluZGV4
KTsNDQogICAgICAgICAgICAgICBmcmVlaXRlbShwKTsNDQogICAgICAgICAg
ICBlbmQ7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgIHByb2NlZHVyZSB0Y29s
bGVjdGlvbi5hdGluc2VydChpbmRleCA6IGxvbmdpbnQ7aXRlbSA6IHBvaW50
ZXIpOw0NCg0NCiAgICAgICB2YXINDQogICAgICAgICAgcCA6IHBpdGVtbGlz
dDsNDQoNDQogICAgICAgYmVnaW4NDQogICAgICAgICAgaWYgKGluZGV4PmNv
dW50KSBvciAoaW5kZXg8MCkgdGhlbg0NCiAgICAgICAgICAgIGVycm9yKGNv
aW5kZXhlcnJvcixpbmRleCkNDQogICAgICAgICAgZWxzZQ0NCiAgICAgICAg
ICAgIGJlZ2luDQ0KICAgICAgICAgICAgICAgaWYgY291bnQ9bGltaXQgdGhl
bg0NCiAgICAgICAgICAgICAgICAgc2V0bGltaXQobGltaXQrZGVsdGEpOw0N
Cg0NCiAgICAgICAgICAgICAgIHsgdmVyaWZ5IHRoYXQgbGltaXQgaGFzIGNo
YW5nZWQgfQ0NCiAgICAgICAgICAgICAgIGlmIGNvdW50PWxpbWl0IHRoZW4N
DQogICAgICAgICAgICAgICAgIGVycm9yKGNvb3ZlcmZsb3csaW5kZXgpDQ0K
ICAgICAgICAgICAgICAgZWxzZQ0NCiAgICAgICAgICAgICAgICAgYmVnaW4N
DQogICAgICAgICAgICAgICAgICAgIHsgY29weSBvbGQgaXRlbXMsIGNvdW50
IGlzIHRlc3RlZCBieSBtb3ZlIH0NDQogICAgICAgICAgICAgICAgICAgIG1v
dmUoaXRlbXNeW2luZGV4XSwNDQogICAgICAgICAgICAgICAgICAgICAgaXRl
bXNeW2luZGV4KzFdLChjb3VudC1pbmRleCkqc2l6ZW9mKHBvaW50ZXIpKTsN
DQogICAgICAgICAgICAgICAgICAgIGluYyhjb3VudCk7DQ0KICAgICAgICAg
ICAgICAgICAgICBpdGVtc15baW5kZXhdOj1pdGVtOw0NCiAgICAgICAgICAg
ICAgICAgZW5kOw0NCiAgICAgICAgICAgIGVuZDsNDQogICAgICAgZW5kOw0N
Cg0NCiAgICAgcHJvY2VkdXJlIHRjb2xsZWN0aW9uLmF0cHV0KGluZGV4IDog
bG9uZ2ludDtpdGVtIDogcG9pbnRlcik7DQ0KDQ0KICAgICAgIGJlZ2luDQ0K
ICAgICAgICAgIGlmIChpbmRleDwwKSBvciAoaW5kZXg+PWNvdW50KSB0aGVu
DQ0KICAgICAgICAgICAgZXJyb3IoY29pbmRleGVycm9yLGluZGV4KQ0NCiAg
ICAgICAgICBlbHNlDQ0KICAgICAgICAgIHsgcmVwbGFjZSB0aGUgaXRlbSBp
biB0aGUgY29sbGVjdGlvbiwNDQogICAgICAgICAgICBidXQgZG9uJ3QgZGVs
ZXRlIGl0IGZyb20gbWVtb3J5ICAgICB9DQ0KICAgICAgICAgICAgaXRlbXNe
W2luZGV4XTo9aXRlbTsNDQogICAgICAgZW5kOw0NCg0NCiAgICAgcHJvY2Vk
dXJlIHRjb2xsZWN0aW9uLmRlbGV0ZShpdGVtIDogcG9pbnRlcik7DQ0KDQ0K
ICAgICAgIGJlZ2luDQ0KICAgICAgICAgIGF0ZGVsZXRlKGluZGV4b2YoaXRl
bSkpOw0NCiAgICAgICBlbmQ7DQ0KDQ0KICAgICBwcm9jZWR1cmUgdGNvbGxl
Y3Rpb24uZGVsZXRlYWxsOw0NCg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAg
ICBjb3VudDo9MDsNDQogICAgICAgZW5kOw0NCg0NCiAgICAgcHJvY2VkdXJl
IHRjb2xsZWN0aW9uLmVycm9yKGNvZGUsaW5mbyA6IGxvbmdpbnQpOw0NCg0N
CiAgICAgICBiZWdpbg0NCiAgICAgICAgICB7IG1ha2VzIHJ1biBlcnJvciAy
MTMgYW5kIDIxNCB9DQ0KICAgICAgICAgIHJ1bmVycm9yKDIxMi1jb2RlKTsN
DQogICAgICAgZW5kOw0NCg0NCiAgICAgZnVuY3Rpb24gZG9fcHJvY19jYWxs
KHByb2MgOiBwb2ludGVyO2l0ZW0gOiBwb2ludGVyKSA6IGJvb2xlYW47DQ0K
DQ0KICAgICB7IHNvcnJ5LCBidXQgdGhpcyBkb2Vzbid0IHdvcmsgd2l0aG91
dCBhc20gfQ0NCg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAgICBhc20NDQog
ICAgICAgICAgICAgLy8gcHVzaCBpdGVtDQ0KICAgICAgICAgICAgIHB1c2hs
IDEyKCVlYnApDQ0KDQ0KICAgICAgICAgICAgIC8vIGxvYWQgJWVicCBvZiB0
Y29sbGVjdGlvbi5maXJzdHRoYXQNDQogICAgICAgICAgICAgbW92bCAoJWVi
cCksJWVheA0NCg0NCiAgICAgICAgICAgICAvLyBsb2FkICVlYnAgb2YgY2Fs
bGVyIG9mIGZpcnN0dGhhdCBvciBmb3JlYWNoDQ0KICAgICAgICAgICAgIG1v
dmwgKCVlYXgpLCVlYXgNDQoNDQogICAgICAgICAgICAgLy8gcHVzaCB0aGlz
ICVlYnANDQogICAgICAgICAgICAgcHVzaGwgJWVheA0NCg0NCiAgICAgICAg
ICAgICAvLyBsb2FkIHBvaW50ZXIgdG8gcHJvY2VkdXJlDQ0KICAgICAgICAg
ICAgIG1vdmwgOCglZWJwKSwlZWF4DQ0KDQ0KICAgICAgICAgICAgIC8vIGRv
IHRoZSBjYWxsDQ0KICAgICAgICAgICAgIGNhbGwgKCVlYXgpDQ0KICAgICAg
ICAgICAgIGxlYXZlDQ0KICAgICAgICAgICAgIHJldCAkOA0NCiAgICAgICAg
ICBlbmQ7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgIGZ1bmN0aW9uIHRjb2xs
ZWN0aW9uLmZpcnN0dGhhdCh0ZXN0IDogcG9pbnRlcikgOiBwb2ludGVyOw0N
Cg0NCiAgICAgICB2YXINDQogICAgICAgICAgaSA6IGxvbmdpbnQ7DQ0KDQ0K
ICAgICAgIGJlZ2luDQ0KICAgICAgICAgIGZvciBpOj0wIHRvIGNvdW50LTEg
ZG8NDQogICAgICAgICAgICBiZWdpbg0NCiAgICAgICAgICAgICAgIGlmIGRv
X3Byb2NfY2FsbCh0ZXN0LGl0ZW1zXltpXSkgdGhlbg0NCiAgICAgICAgICAg
ICAgICAgYmVnaW4NDQogICAgICAgICAgICAgICAgICAgIGZpcnN0dGhhdDo9
aXRlbXNeW2ldOw0NCiAgICAgICAgICAgICAgICAgICAgZXhpdDsNDQogICAg
ICAgICAgICAgICAgIGVuZDsNDQogICAgICAgICAgICBlbmQ7DQ0KICAgICAg
ICAgIGZpcnN0dGhhdDo9bmlsOw0NCiAgICAgICBlbmQ7DQ0KDQ0KICAgICBw
cm9jZWR1cmUgdGNvbGxlY3Rpb24uZm9yZWFjaChhY3Rpb24gOiBwb2ludGVy
KTsNDQoNDQogICAgICAgdmFyDQ0KICAgICAgICAgIGkgOiBsb25naW50Ow0N
Cg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAgICBmb3IgaTo9MCB0byBjb3Vu
dC0xIGRvDQ0KICAgICAgICAgICAgZG9fcHJvY19jYWxsKGFjdGlvbixpdGVt
c15baV0pOw0NCiAgICAgICBlbmQ7DQ0KDQ0KICAgICBwcm9jZWR1cmUgdGNv
bGxlY3Rpb24uZnJlZShpdGVtIDogcG9pbnRlcik7DQ0KDQ0KICAgICAgIGJl
Z2luDQ0KICAgICAgICAgIGRlbGV0ZShpdGVtKTsNDQogICAgICAgICAgZnJl
ZWl0ZW0oaXRlbSk7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgIHByb2NlZHVy
ZSB0Y29sbGVjdGlvbi5mcmVlYWxsOw0NCg0NCiAgICAgICB2YXINDQogICAg
ICAgICAgaSA6IGxvbmdpbnQ7DQ0KDQ0KICAgICAgIGJlZ2luDQ0KICAgICAg
ICAgIGZvciBpOj0wIHRvIGNvdW50LTEgZG8NDQogICAgICAgICAgICBmcmVl
aXRlbShpdGVtc15baV0pOw0NCiAgICAgICAgICBjb3VudDo9MDsNDQogICAg
ICAgZW5kOw0NCg0NCiAgICAgcHJvY2VkdXJlIHRjb2xsZWN0aW9uLmZyZWVp
dGVtKGl0ZW0gOiBwb2ludGVyKTsNDQoNDQogICAgICAgdmFyDQ0KICAgICAg
ICAgIHAgOiBwb2JqZWN0Ow0NCg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAg
ICB7IGRpcmVjdCBjb252ZXJzYXRpb24gY3Jhc2hlcyB0aGUgY29tcGlsZXIg
fQ0NCiAgICAgICAgICBwOj1wb2JqZWN0KGl0ZW0pOw0NCiAgICAgICAgICBp
ZiBhc3NpZ25lZChpdGVtKSB0aGVuDQ0KICAgICAgICAgICAgZGlzcG9zZShw
LGRvbmUpOw0NCiAgICAgICBlbmQ7DQ0KDQ0KICAgICBmdW5jdGlvbiB0Y29s
bGVjdGlvbi5nZXRpdGVtKHZhciBzIDogdHN0cmVhbSkgOiBwb2ludGVyOw0N
Cg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAgICBnZXRpdGVtOj1zLmdldDsN
DQogICAgICAgZW5kOw0NCg0NCiAgICAgZnVuY3Rpb24gdGNvbGxlY3Rpb24u
aW5kZXhvZihpdGVtIDogcG9pbnRlcikgOiBsb25naW50Ow0NCg0NCiAgICAg
ICB2YXINDQogICAgICAgICAgaSA6IGxvbmdpbnQ7DQ0KDQ0KICAgICAgIGJl
Z2luDQ0KICAgICAgICAgIGZvciBpOj0wIHRvIGNvdW50LTEgZG8NDQogICAg
ICAgICAgICBiZWdpbg0NCiAgICAgICAgICAgICAgIGlmIGl0ZW1zXltpXT1p
dGVtIHRoZW4NDQogICAgICAgICAgICAgICAgIGJlZ2luDQ0KICAgICAgICAg
ICAgICAgICAgICBpbmRleG9mOj1pOw0NCiAgICAgICAgICAgICAgICAgICAg
ZXhpdDsNDQogICAgICAgICAgICAgICAgIGVuZDsNDQogICAgICAgICAgICBl
bmQ7DQ0KICAgICAgICAgIGluZGV4b2Y6PS0xOw0NCiAgICAgICBlbmQ7DQ0K
DQ0KICAgICBwcm9jZWR1cmUgdGNvbGxlY3Rpb24uaW5zZXJ0KGl0ZW0gOiBw
b2ludGVyKTsNDQoNDQogICAgICAgYmVnaW4NDQogICAgICAgICAgYXRpbnNl
cnQoY291bnQsaXRlbSk7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgIGZ1bmN0
aW9uIHRjb2xsZWN0aW9uLmxhc3R0aGF0KHRlc3QgOiBwb2ludGVyKSA6IHBv
aW50ZXI7DQ0KDQ0KICAgICAgIHZhcg0NCiAgICAgICAgICBpIDogbG9uZ2lu
dDsNDQoNDQogICAgICAgYmVnaW4NDQogICAgICAgICAgZm9yIGk6PWNvdW50
LTEgZG93bnRvIDAgZG8NDQogICAgICAgICAgICBiZWdpbg0NCiAgICAgICAg
ICAgICAgIGlmIGRvX3Byb2NfY2FsbCh0ZXN0LGl0ZW1zXltpXSkgdGhlbg0N
CiAgICAgICAgICAgICAgICAgYmVnaW4NDQogICAgICAgICAgICAgICAgICAg
IGxhc3R0aGF0Oj1pdGVtc15baV07DQ0KICAgICAgICAgICAgICAgICAgICBl
eGl0Ow0NCiAgICAgICAgICAgICAgICAgZW5kOw0NCiAgICAgICAgICAgIGVu
ZDsNDQogICAgICAgICAgbGFzdHRoYXQ6PW5pbDsNDQogICAgICAgZW5kOw0N
Cg0NCiAgICAgcHJvY2VkdXJlIHRjb2xsZWN0aW9uLnBhY2s7DQ0KDQ0KICAg
ICAgIHZhcg0NCiAgICAgICAgICBpIDogbG9uZ2ludDsNDQoNDQogICAgICAg
YmVnaW4NDQogICAgICAgICAgd2hpbGUgaTxjb3VudCBkbw0NCiAgICAgICAg
ICAgIGJlZ2luDQ0KICAgICAgICAgICAgICAgaWYgaXRlbXNeW2ldPW5pbCB0
aGVuDQ0KICAgICAgICAgICAgICAgICBhdGRlbGV0ZShpKQ0NCiAgICAgICAg
ICAgICAgIGVsc2UNDQogICAgICAgICAgICAgICAgIGluYyhpKTsNDQogICAg
ICAgICAgICBlbmQ7DQ0KICAgICAgIGVuZDsNDQoNDQogICAgIHByb2NlZHVy
ZSB0Y29sbGVjdGlvbi5wdXRpdGVtKHZhciBzIDogdHN0cmVhbTtpdGVtIDog
cG9pbnRlcik7DQ0KDQ0KICAgICAgIGJlZ2luDQ0KICAgICAgICAgIHMucHV0
KHBvYmplY3QoaXRlbSkpOw0NCiAgICAgICBlbmQ7DQ0KDQ0KICAgICBwcm9j
ZWR1cmUgdGNvbGxlY3Rpb24uc2V0bGltaXQoYWxpbWl0IDogbG9uZ2ludCk7
DQ0KDQ0KICAgICAgIHZhcg0NCiAgICAgICAgICBwIDogcGl0ZW1saXN0Ow0N
Cg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAgICB7IFJlc2l6ZSBhbGltaXQg
fQ0NCiAgICAgICAgICBpZiBhbGltaXQ8Y291bnQgdGhlbg0NCiAgICAgICAg
ICAgIGFsaW1pdDo9Y291bnQ7DQ0KICAgICAgICAgIGlmIGFsaW1pdD5tYXhj
b2xsZWN0aW9uc2l6ZSB0aGVuDQ0KICAgICAgICAgICAgYWxpbWl0Oj1tYXhj
b2xsZWN0aW9uc2l6ZTsNDQogICAgICAgICAgaWYgYWxpbWl0PD5saW1pdCB0
aGVuDQ0KICAgICAgICAgICAgYmVnaW4NDQogICAgICAgICAgICAgICB7IENy
ZWF0ZSBhIG5ldyBhcnJheSB9DQ0KICAgICAgICAgICAgICAgZ2V0bWVtKHAs
YWxpbWl0KnNpemVvZihwb2ludGVyKSk7DQ0KDQ0KICAgICAgICAgICAgICAg
eyBDb3BpZSB0aGUgZGF0YXMgfQ0NCiAgICAgICAgICAgICAgIG1vdmUoaXRl
bXNeLHBeLGNvdW50KnNpemVvZihQb2ludGVyKSk7DQ0KDQ0KICAgICAgICAg
ICAgICAgeyBEZWxldGUgdGhlIG9sZCBhcnJheSB9DQ0KICAgICAgICAgICAg
ICAgZnJlZW1lbShpdGVtcyxzaXplb2YocG9pbnRlcikqbGltaXQpOw0NCg0N
CiAgICAgICAgICAgICAgeyBJbml0aWFsaXNlIHRoZSBuZXcgYXJyYXkgfQ0N
CiAgICAgICAgICAgICAgaXRlbXM6PXA7DQ0KICAgICAgICAgICAgICBsaW1p
dDo9YWxpbWl0Ow0NCiAgICAgICAgICAgZW5kOw0NCiAgICAgICBlbmQ7DQ0K
DQ0KICAgICBwcm9jZWR1cmUgdGNvbGxlY3Rpb24uc3RvcmUodmFyIHMgOiB0
c3RyZWFtKTsNDQoNDQogICAgICAgdmFyDQ0KICAgICAgICAgIGkgOiBsb25n
aW50Ow0NCg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAgICBzLndyaXRlKGNv
dW50LHNpemVvZihjb3VudCkpOw0NCiAgICAgICAgICBzLndyaXRlKGxpbWl0
LHNpemVvZihsaW1pdCkpOw0NCiAgICAgICAgICBzLndyaXRlKGRlbHRhLHNp
emVvZihkZWx0YSkpOw0NCiAgICAgICAgICBmb3IgaTo9MCB0byBjb3VudC0x
IGRvDQ0KICAgICAgICAgICAgcHV0aXRlbShzLGl0ZW1zXltpXSk7DQ0KICAg
ICAgIGVuZDsNDQoNDQp7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
Kg0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTT1JURURDT0xMRUNU
SU9ODQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKip9DQ0KDQ0K
ICAgICBjb25zdHJ1Y3RvciB0c29ydGVkY29sbGVjdGlvbi5sb2FkKHZhciBz
IDogdHN0cmVhbSk7DQ0KDQ0KICAgICAgIGJlZ2luDQ0KICAgICAgICAgIGlu
aGVyaXRlZCBsb2FkKHMpOw0NCiAgICAgICAgICBzLnJlYWQoZHVwbGljYXRl
cywxKTsNDQogICAgICAgZW5kOw0NCg0NCiAgICAgZnVuY3Rpb24gdHNvcnRl
ZGNvbGxlY3Rpb24uY29tcGFyZShrZXkxLGtleTIgOiBwb2ludGVyKSA6IGlu
dGVnZXI7DQ0KDQ0KICAgICAgIGJlZ2luDQ0KICAgICAgICAgIGFic3RyYWN0
Ow0NCiAgICAgICBlbmQ7DQ0KDQ0KICAgICBmdW5jdGlvbiB0c29ydGVkY29s
bGVjdGlvbi5pbmRleG9mKGl0ZW0gOiBwb2ludGVyKSA6IGxvbmdpbnQ7DQ0K
DQ0KICAgICAgIHZhcg0NCiAgICAgICAgICBpIDogbG9uZ2ludDsNDQoNDQog
ICAgICAgYmVnaW4NDQogICAgICAgICAgaW5kZXhvZjo9LTE7DQ0KICAgICAg
ICAgIGlmIHNlYXJjaChrZXlvZihpdGVtKSxpKSB0aGVuDQ0KICAgICAgICAg
ICAgYmVnaW4NDQogICAgICAgICAgICAgICBpZiBkdXBsaWNhdGVzIHRoZW4N
DQogICAgICAgICAgICAgICAgIGJlZ2luDQ0KICAgICAgICAgICAgICAgICAg
ICB3aGlsZSAoaTxjb3VudCkgYW5kDQ0KICAgICAgICAgICAgICAgICAgICAg
IChjb21wYXJlKGtleW9mKGl0ZW1zXltpXSksa2V5b2YoaXRlbSkpPTApIGRv
DQ0KICAgICAgICAgICAgICAgICAgICAgIGJlZ2luDQ0KICAgICAgICAgICAg
ICAgICAgICAgICAgIGlmIGl0ZW1zXltpXT1pdGVtIHRoZW4NDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICBiZWdpbg0NCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGluZGV4b2Y6PWk7DQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZXhpdDsNDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICBlbmQ7DQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGluYyhpKTsNDQog
ICAgICAgICAgICAgICAgICAgICAgZW5kOw0NCiAgICAgICAgICAgICAgICAg
ZW5kDQ0KICAgICAgICAgICAgICAgZWxzZQ0NCiAgICAgICAgICAgICAgICAg
YmVnaW4NDQogICAgICAgICAgICAgICAgICAgIGlmIGl0ZW1zXltpXT1pdGVt
IHRoZW4NDQogICAgICAgICAgICAgICAgICAgICAgaW5kZXhvZjo9LTE7DQ0K
ICAgICAgICAgICAgICAgICBlbmQ7DQ0KICAgICAgICAgICAgZW5kOw0NCiAg
ICAgICBlbmQ7DQ0KDQ0KICAgICBwcm9jZWR1cmUgdHNvcnRlZGNvbGxlY3Rp
b24uaW5zZXJ0KGl0ZW0gOiBwb2ludGVyKTsNDQoNDQogICAgICAgdmFyDQ0K
ICAgICAgICAgIHBvcyA6IGxvbmdpbnQ7DQ0KICAgICAgICAgIGIgOiBib29s
ZWFuOw0NCg0NCiAgICAgICBiZWdpbg0NCiAgICAgICAgICBiOj1zZWFyY2go
a2V5b2YoaXRlbSkscG9zKTsNDQogICAgICAgICAgaWYgbm90KGIpIG9yIGR1
cGxpY2F0ZXMgdGhlbg0NCiAgICAgICAgICAgIGF0aW5zZXJ0KHBvcyxpdGVt
KTsNDQogICAgICAgZW5kOw0NCg0NCiAgICAgZnVuY3Rpb24gdHNvcnRlZGNv
bGxlY3Rpb24ua2V5b2YoaXRlbSA6IHBvaW50ZXIpIDogcG9pbnRlcjsNDQoN
DQogICAgICAgYmVnaW4NDQogICAgICAgICAga2V5b2Y6PWl0ZW07DQ0KICAg
ICAgIGVuZDsNDQoNDQogICAgIGZ1bmN0aW9uIHRzb3J0ZWRjb2xsZWN0aW9u
LnNlYXJjaChrZXkgOiBwb2ludGVyO3ZhciBpbmRleCA6IGxvbmdpbnQpIDog
Ym9vbGVhbjsNDQoNDQogICAgICAgdmFyDQ0KICAgICAgICAgIHgsbCxyIDog
bG9uZ2ludDsNDQoNDQogICAgICAgYmVnaW4NDQogICAgICAgICAgbDo9MDsN
DQogICAgICAgICAgeDo9MDsNDQogICAgICAgICAgcjo9Y291bnQtMTsNDQog
ICAgICAgICAgaWYgY291bnQ+MCB0aGVuDQ0KICAgICAgICAgICAgcmVwZWF0
DQ0KICAgICAgICAgICAgICB4Oj0obCtyKSBkaXYgMjsNDQogICAgICAgICAg
ICAgIGlmIGNvbXBhcmUoa2V5LGtleW9mKGl0ZW1zXlt4XSkpPDAgdGhlbg0N
CiAgICAgICAgICAgICAgICByOj14LTENDQogICAgICAgICAgICAgIGVsc2UN
DQogICAgICAgICAgICAgICAgbDo9eCsxOw0NCiAgICAgICAgICAgIHVudGls
IChjb21wYXJlKGtleSxrZXlvZihpdGVtc15beF0pKT0wKSBvciAobD5yKTsN
DQogICAgICAgICAgaWYgY29tcGFyZShrZXksa2V5b2YoaXRlbXNeW3hdKSk9
MCB0aGVuDQ0KICAgICAgICAgICAgYmVnaW4NDQogICAgICAgICAgICAgICBp
ZiBkdXBsaWNhdGVzIHRoZW4NDQogICAgICAgICAgICAgICAgIHdoaWxlICh4
PjApIGFuZCAoY29tcGFyZShrZXksa2V5b2YoaXRlbXNeW3gtMV0pKT0wKSBk
bw0NCiAgICAgICAgICAgICAgICAgICBkZWMoeCk7DQ0KICAgICAgICAgICAg
ICAgaW5kZXg6PXg7DQ0KICAgICAgICAgICAgICAgc2VhcmNoOj10cnVlOw0N
CiAgICAgICAgICAgIGVuZA0NCiAgICAgICAgICBlbHNlDQ0KICAgICAgICAg
ICAgYmVnaW4NDQogICAgICAgICAgICAgICBpbmRleDo9bDsNDQogICAgICAg
ICAgICAgICBzZWFyY2g6PWZhbHNlOw0NCiAgICAgICAgICAgIGVuZDsNDQog
ICAgICAgZW5kOw0NCg0NCiAgICAgcHJvY2VkdXJlIHRzb3J0ZWRjb2xsZWN0
aW9uLnN0b3JlKHZhciBzIDogdHN0cmVhbSk7DQ0KDQ0KICAgICAgIGJlZ2lu
DQ0KICAgICAgICAgIGluaGVyaXRlZCBzdG9yZShzKTsNDQogICAgICAgICAg
cy53cml0ZShkdXBsaWNhdGVzLDEpOw0NCiAgICAgICBlbmQ7DQ0KDQ0Keyoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioNDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICBUU1RSSU5HQ09MTEVDVElPTg0NCiAqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqfQ0NCg0NCiAgICAgZnVuY3Rpb24gdHN0
cmluZ2NvbGxlY3Rpb24uY29tcGFyZShrZXkxLGtleTIgOiBwb2ludGVyKSA6
IGludGVnZXI7DQ0KDQ0KICAgICAgIGJlZ2luDQ0KICAgICAgICAgIHsgISEh
ISBkbyB0aGlzIGJldHRlciB9DQ0KICAgICAgICAgIGlmIHBzdHJpbmcoa2V5
MSlePHBzdHJpbmcoa2V5MileIHRoZW4NDQogICAgICAgICAgICBjb21wYXJl
Oj0tMQ0NCiAgICAgICAgICBlbHNlIGlmIHBzdHJpbmcoa2V5MSlePnBzdHJp
bmcoa2V5MileIHRoZW4NDQogICAgICAgICAgICBjb21wYXJlOj0xDQ0KICAg
ICAgICAgIGVsc2UNDQogICAgICAgICAgICBjb21wYXJlOj0wOw0NCiAgICAg
ICBlbmQ7DQ0KDQ0KICAgICBwcm9jZWR1cmUgdHN0cmluZ2NvbGxlY3Rpb24u
ZnJlZWl0ZW0oaXRlbSA6IHBvaW50ZXIpOw0NCg0NCiAgICAgICBiZWdpbg0N
CiAgICAgICAgICBkaXNwb3Nlc3RyKHBzdHJpbmcoaXRlbSkpOw0NCiAgICAg
ICBlbmQ7DQ0KDQ0KICAgICBmdW5jdGlvbiB0c3RyaW5nY29sbGVjdGlvbi5n
ZXRpdGVtKHZhciBzIDogdHN0cmVhbSkgOiBwb2ludGVyOw0NCg0NCiAgICAg
ICBiZWdpbg0NCiAgICAgICAgICBnZXRpdGVtOj1zLnJlYWRzdHI7DQ0KICAg
ICAgIGVuZDsNDQoNDQogICAgIHByb2NlZHVyZSB0c3RyaW5nY29sbGVjdGlv
bi5wdXRpdGVtKHZhciBzIDogdHN0cmVhbTtpdGVtIDogcG9pbnRlcik7DQ0K
DQ0KICAgICAgIGJlZ2luDQ0KICAgICAgICAgIHMud3JpdGVzdHIocHN0cmlu
ZyhpdGVtKSk7DQ0KICAgICAgIGVuZDsNDQoNDQp7KioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKg0NCiAgICAgICAgICAgICAgICAgICAgICAgICAg
IFRSRVNPVVJDRUNPTExFQ1RJT04NDQogKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKn0NDQoNDQogICB0eXBlDQ0KICAgICAgcHJlc291cmNlaW5k
ZXhpdGVtID0gXnRyZXNvdXJjZWluZGV4aXRlbTsNDQoNDQogICAgICB0cmVz
b3VyY2VpbmRleGl0ZW0gPSByZWNvcmQNDQogICAgICAgICBuYW1lIDogcHN0
cmluZzsNDQogICAgICAgICBwb3MgOiBsb25naW50Ow0NCiAgICAgIGVuZDsN
DQoNDQogICBwcm9jZWR1cmUgdHJlc291cmNlY29sbGVjdGlvbi5mcmVlaXRl
bShpdGVtIDogcG9pbnRlcik7DQ0KDQ0KICAgICBiZWdpbg0NCiAgICAgICAg
ZGlzcG9zZXN0cihwcmVzb3VyY2VpbmRleGl0ZW0oaXRlbSleLm5hbWUpOw0N
CiAgICAgICAgZGlzcG9zZShwcmVzb3VyY2VpbmRleGl0ZW0oaXRlbSkpOw0N
CiAgICAgZW5kOw0NCg0NCiAgIGZ1bmN0aW9uIHRyZXNvdXJjZWNvbGxlY3Rp
b24uZ2V0aXRlbSh2YXIgcyA6IHRzdHJlYW0pIDogcG9pbnRlcjsNDQoNDQog
ICAgIHZhcg0NCiAgICAgICAgcCA6IHByZXNvdXJjZWluZGV4aXRlbTsNDQoN
DQogICAgIGJlZ2luDQ0KICAgICAgICBuZXcocCk7DQ0KICAgICAgICBwXi5u
YW1lOj1zLnJlYWRzdHI7DQ0KICAgICAgICBzLnJlYWQocF4ucG9zLHNpemVv
ZihwXi5wb3MpKTsNDQogICAgICAgIGdldGl0ZW06PXA7DQ0KICAgICBlbmQ7
DQ0KDQ0KICAgZnVuY3Rpb24gdHJlc291cmNlY29sbGVjdGlvbi5rZXlvZihp
dGVtIDogcG9pbnRlcikgOiBwb2ludGVyOw0NCg0NCiAgICAgYmVnaW4NDQog
ICAgICAgIGtleW9mOj1wcmVzb3VyY2VpbmRleGl0ZW0oaXRlbSleLm5hbWU7
DQ0KICAgICBlbmQ7DQ0KDQ0KICAgcHJvY2VkdXJlIHRyZXNvdXJjZWNvbGxl
Y3Rpb24ucHV0aXRlbSh2YXIgcyA6IHRzdHJlYW07aXRlbSA6IHBvaW50ZXIp
Ow0NCg0NCiAgICAgYmVnaW4NDQogICAgICAgIHMud3JpdGVzdHIocHJlc291
cmNlaW5kZXhpdGVtKGl0ZW0pXi5uYW1lKTsNDQogICAgICAgIHMud3JpdGUo
cHJlc291cmNlaW5kZXhpdGVtKGl0ZW0pXi5wb3MsDQ0KICAgICAgICAgIHNp
emVvZihwcmVzb3VyY2VpbmRleGl0ZW0oaXRlbSleLnBvcykpOw0NCiAgICAg
ZW5kOw0NCg0NCnsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQ0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTVFJJTkdMSVNUDQ0KICoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKip9DQ0KDQ0KICAgIGNvbnN0
cnVjdG9yIHRzdHJpbmdsaXN0LmluaXQoYXN0cnNpemUsYWluZGV4c2l6ZSA6
IGxvbmdpbnQpOw0NCg0NCiAgICAgIGJlZ2luDQ0KICAgICAgICAgaW5oZXJp
dGVkIGluaXQ7DQ0KICAgICAgICAgeyByb290IGlzIGJlZW4gc2V0IHRvIHpl
cm8gYnkgdG9iamVjdC5pbml0ISB9DQ0KICAgICAgZW5kOw0NCg0NCiAgICBj
b25zdHJ1Y3RvciB0c3RyaW5nbGlzdC5sb2FkKHZhciBzIDogdHN0cmVhbSk7
DQ0KDQ0KICAgICAgdmFyDQ0KICAgICAgICAgcCA6IHBzdHJpbmc7DQ0KICAg
ICAgICAgY291bnQsaSxrIDogbG9uZ2ludDsNDQoNDQogICAgICBiZWdpbg0N
CiAgICAgICAgIHMucmVhZChjb3VudCxzaXplb2YobG9uZ2ludCkpOw0NCiAg
ICAgICAgIGZvciBpOj0xIHRvIGNvdW50IGRvDQ0KICAgICAgICAgICBiZWdp
bg0NCiAgICAgICAgICAgICAgcy5yZWFkKGssc2l6ZW9mKGxvbmdpbnQpKTsN
DQogICAgICAgICAgICAgIHA6PXMucmVhZHN0cjsNDQogICAgICAgICAgICAg
IHB1dChrLHApOw0NCiAgICAgICAgICAgZW5kOw0NCiAgICAgIGVuZDsNDQoN
DQogICAgZGVzdHJ1Y3RvciB0c3RyaW5nbGlzdC5kb25lOw0NCg0NCiAgICAg
IHByb2NlZHVyZSBkZWxldGUocCA6IHBzdHJpbmRleG5vZGUpOw0NCg0NCiAg
ICAgICAgYmVnaW4NDQogICAgICAgICAgIGlmIGFzc2lnbmVkKHApIHRoZW4N
DQogICAgICAgICAgICAgYmVnaW4NDQogICAgICAgICAgICAgICAgZGlzcG9z
ZXN0cihwXi5zKTsNDQogICAgICAgICAgICAgICAgZGVsZXRlKHBeLmxlZnQp
Ow0NCiAgICAgICAgICAgICAgICBkZWxldGUocF4ucmlnaHQpOw0NCiAgICAg
ICAgICAgICBlbmQ7DQ0KICAgICAgICBlbmQ7DQ0KDQ0KICAgICAgYmVnaW4N
DQogICAgICAgICBkZWxldGUocm9vdCk7DQ0KICAgICAgZW5kOw0NCg0NCiAg
ICBmdW5jdGlvbiB0c3RyaW5nbGlzdC5nZXQoa2V5IDogbG9uZ2ludCkgOiBz
dHJpbmc7DQ0KDQ0KICAgICAgdmFyDQ0KICAgICAgICAgcyA6IHBzdHJpbmc7
DQ0KDQ0KICAgICAgZnVuY3Rpb24gc2VhcmNoKHAgOiBwc3RyaW5kZXhub2Rl
KSA6IGJvb2xlYW47DQ0KDQ0KICAgICAgICBiZWdpbg0NCiAgICAgICAgICAg
aWYgYXNzaWduZWQocCkgdGhlbg0NCiAgICAgICAgICAgICBiZWdpbg0NCiAg
ICAgICAgICAgICAgICBpZiBwXi5rZXk9a2V5IHRoZW4NDQogICAgICAgICAg
ICAgICAgICBiZWdpbg0NCiAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDo9
dHJ1ZTsNDQogICAgICAgICAgICAgICAgICAgICBzOj1wXi5zOw0NCiAgICAg
ICAgICAgICAgICAgIGVuZA0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIGtl
eT5wXi5rZXkgdGhlbg0NCiAgICAgICAgICAgICAgICAgIHNlYXJjaDo9c2Vh
cmNoKHBeLnJpZ2h0KQ0NCiAgICAgICAgICAgICAgICBlbHNlDQ0KICAgICAg
ICAgICAgICAgICAgc2VhcmNoOj1zZWFyY2gocF4ubGVmdCk7DQ0KICAgICAg
ICAgICAgIGVuZA0NCiAgICAgICAgICAgZWxzZQ0NCiAgICAgICAgICAgICBz
ZWFyY2g6PWZhbHNlOw0NCiAgICAgICAgZW5kOw0NCg0NCiAgICAgIGJlZ2lu
DQ0KICAgICAgICAgaWYgc2VhcmNoKHJvb3QpIHRoZW4NDQogICAgICAgICAg
IGdldDo9c14NDQogICAgICAgICBlbHNlDQ0KICAgICAgICAgICBnZXQ6PScn
Ow0NCiAgICAgIGVuZDsNDQoNDQogICAgcHJvY2VkdXJlIHRzdHJpbmdsaXN0
LnB1dChrZXkgOiBsb25naW50O3N0ciA6IHBzdHJpbmcpOw0NCg0NCiAgICAg
IGZ1bmN0aW9uIGluc2VydCh2YXIgcCA6IHBzdHJpbmRleG5vZGUpIDogYm9v
bGVhbjsNDQoNDQogICAgICAgIGJlZ2luDQ0KICAgICAgICAgICBpZiBhc3Np
Z25lZChwKSB0aGVuDQ0KICAgICAgICAgICAgIGJlZ2luDQ0KICAgICAgICAg
ICAgICAgIGlmIHBeLmtleT1rZXkgdGhlbg0NCiAgICAgICAgICAgICAgICAg
IGluc2VydDo9ZmFsc2UNDQogICAgICAgICAgICAgICAgZWxzZSBpZiBrZXk+
cF4ua2V5IHRoZW4NDQogICAgICAgICAgICAgICAgICBpbnNlcnQ6PWluc2Vy
dChwXi5yaWdodCkNDQogICAgICAgICAgICAgICAgZWxzZQ0NCiAgICAgICAg
ICAgICAgICAgIGluc2VydDo9aW5zZXJ0KHBeLmxlZnQpOw0NCiAgICAgICAg
ICAgICBlbmQNDQogICAgICAgICAgIGVsc2UNDQogICAgICAgICAgICAgYmVn
aW4NDQogICAgICAgICAgICAgICAgaW5zZXJ0Oj10cnVlOw0NCiAgICAgICAg
ICAgICAgICBuZXcocCk7DQ0KICAgICAgICAgICAgICAgIHBeLmxlZnQ6PW5p
bDsNDQogICAgICAgICAgICAgICAgcF4ucmlnaHQ6PW5pbDsNDQogICAgICAg
ICAgICAgICAgcF4uczo9c3RyOw0NCiAgICAgICAgICAgICAgICBwXi5rZXk6
PWtleTsNDQogICAgICAgICAgICAgZW5kOw0NCiAgICAgICAgZW5kOw0NCg0N
CiAgICAgIGJlZ2luDQ0KICAgICAgICAgaWYgbm90KGluc2VydChyb290KSkg
dGhlbg0NCiAgICAgICAgICAgZGlzcG9zZXN0cihzdHIpOw0NCiAgICAgIGVu
ZDsNDQoNDQogICAgcHJvY2VkdXJlIHRzdHJpbmdsaXN0LnB1dChrZXkgOiBs
b25naW50O2NvbnN0IHMgOiBzdHJpbmcpOw0NCg0NCiAgICAgIGJlZ2luDQ0K
ICAgICAgICAgcHV0KGtleSxuZXdzdHIocykpOw0NCiAgICAgIGVuZDsNDQoN
DQogICAgcHJvY2VkdXJlIHRzdHJpbmdsaXN0LnN0b3JlKHZhciBzIDogdHN0
cmVhbSk7DQ0KDQ0KICAgICAgcHJvY2VkdXJlIHdyaXRlKHAgOiBwc3RyaW5k
ZXhub2RlKTsNDQoNDQogICAgICAgIGJlZ2luDQ0KICAgICAgICAgICBpZiBh
c3NpZ25lZChwKSB0aGVuDQ0KICAgICAgICAgICAgIGJlZ2luDQ0KICAgICAg
ICAgICAgICAgIHMud3JpdGUocF4ua2V5LHNpemVvZihsb25naW50KSk7DQ0K
ICAgICAgICAgICAgICAgIHMud3JpdGVzdHIocF4ucyk7DQ0KICAgICAgICAg
ICAgICAgIHdyaXRlKHBeLmxlZnQpOw0NCiAgICAgICAgICAgICAgICB3cml0
ZShwXi5yaWdodCk7DQ0KICAgICAgICAgICAgIGVuZDsNDQogICAgICAgIGVu
ZDsNDQoNDQogICAgICBiZWdpbg0NCiAgICAgICAgIHdyaXRlKHJvb3QpOw0N
CiAgICAgIGVuZDsNDQoNDQplbmQuDQ0K
---305287625-1281818584-864766008=:11773--


Pierre Phaneuf (pp@dilu.ml.org)

HTML conversion by Lluís de Yzaguirre i Maura
Institut de Lingüística Aplicada - Universitat "Pompeu Fabra"
e-mail: de_yza@upf.es