[ODE] multiple contacts and sticking on the cusp

David McClurg dmcclurg at pandemicstudios.com.au
Mon Oct 28 18:19:02 2002


This is a multi-part message in MIME format.

------_=_NextPart_001_01C27EE9.1ED0102A
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

i've found that i need to combine contacts when sphere bodies roll from =
one static geom to another.  to understand the problem, let me show you =
an example...

attached is a modified version of test_boxstack.cpp.  hit the 's' key to =
drop a sphere and watch what happens.  see how it sticks on the cusp =
between the ramp and the ground plane?

that is kind of weird.  it happens when spheres are rolling over boxes, =
planes, or meshes.  it can even happen if you embed a ccylinder into the =
ground and roll up next to it.  you will stick for a while before you =
can pull yourself away from the ccylinder.

is this expected or is it a bug?  if it is expected, perhaps it should =
automatically be handled because it is so common to run up against.  =
erwin handles it within a single tri-list by merging the contacts into a =
single contact.  but you need to do this on a higher level as well =
between different trilists, boxes, and planes.

------_=_NextPart_001_01C27EE9.1ED0102A
Content-Type: application/octet-stream;
	name="test_boxstack.cpp"
Content-Transfer-Encoding: base64
Content-Description: test_boxstack.cpp
Content-Disposition: attachment;
	filename="test_boxstack.cpp"

LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKiBPcGVuIER5bmFtaWNzIEVu
Z2luZSwgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgUnVzc2VsbCBMLiBTbWl0aC4gICAgICAgKg0K
ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gIEVtYWlsOiBydXNzQHExMi5vcmcgICBXZWI6IHd3dy5x
MTIub3JnICAgICAgICAgICoNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yICAgICAgICAgKg0K
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICoNCiAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlICAqDQogKiAgICAgICBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCAgKg0K
ICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUg
R05VIExlc3NlciAgICAgICoNCiAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5j
bHVkZWQgd2l0aCB0aGlzIGxpYnJhcnkgaW4gdGhlICAgICAqDQogKiAgICAgICBmaWxlIExJQ0VO
U0UuVFhULiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0K
ICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlz
IGxpYnJhcnkgaW4gICAgICoNCiAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELlRYVC4gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0K
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsICAgICAgICoNCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAqDQogKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMgICAgKg0K
ICogTElDRU5TRS5UWFQgYW5kIExJQ0VOU0UtQlNELlRYVCBmb3IgbW9yZSBkZXRhaWxzLiAgICAg
ICAgICAgICAgICAgICAgICoNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8N
Cg0KI2luY2x1ZGUgPG9kZS9vZGUuaD4NCiNpbmNsdWRlIDxkcmF3c3R1ZmYvZHJhd3N0dWZmLmg+
DQoNCiNpZmRlZiBNU1ZDDQojcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MjQ0IDQzMDUpICAvLyBm
b3IgVkMrKywgbm8gcHJlY2lzaW9uIGxvc3MgY29tcGxhaW50cw0KI2VuZGlmDQoNCi8vIHNlbGVj
dCBjb3JyZWN0IGRyYXdpbmcgZnVuY3Rpb25zDQoNCiNpZmRlZiBkRE9VQkxFDQojZGVmaW5lIGRz
RHJhd0JveCBkc0RyYXdCb3hEDQojZGVmaW5lIGRzRHJhd1NwaGVyZSBkc0RyYXdTcGhlcmVEDQoj
ZGVmaW5lIGRzRHJhd0N5bGluZGVyIGRzRHJhd0N5bGluZGVyRA0KI2RlZmluZSBkc0RyYXdDYXBw
ZWRDeWxpbmRlciBkc0RyYXdDYXBwZWRDeWxpbmRlckQNCiNlbmRpZg0KDQoNCi8vIHNvbWUgY29u
c3RhbnRzDQoNCiNkZWZpbmUgTlVNIDEJCQkvLyBtYXggbnVtYmVyIG9mIG9iamVjdHMNCiNkZWZp
bmUgREVOU0lUWSAoNS4wKQkJLy8gZGVuc2l0eSBvZiBhbGwgb2JqZWN0cw0KI2RlZmluZSBHUEIg
MwkJCS8vIG1heGltdW0gbnVtYmVyIG9mIGdlb21ldHJpZXMgcGVyIGJvZHkNCg0KDQovLyBkeW5h
bWljcyBhbmQgY29sbGlzaW9uIG9iamVjdHMNCg0Kc3RydWN0IE15T2JqZWN0IHsNCiAgZEJvZHlJ
RCBib2R5OwkJCS8vIHRoZSBib2R5DQogIGRHZW9tSUQgZ2VvbVtHUEJdOwkJLy8gZ2VvbWV0cmll
cyByZXByZXNlbnRpbmcgdGhpcyBib2R5DQp9Ow0KDQpzdGF0aWMgaW50IG51bT0wOwkJLy8gbnVt
YmVyIG9mIG9iamVjdHMgaW4gc2ltdWxhdGlvbg0Kc3RhdGljIGludCBuZXh0b2JqPTA7CQkvLyBu
ZXh0IG9iamVjdCB0byByZWN5Y2xlIGlmIG51bT09TlVNDQpzdGF0aWMgZFdvcmxkSUQgd29ybGQ7
DQpzdGF0aWMgZFNwYWNlSUQgc3BhY2U7DQpzdGF0aWMgTXlPYmplY3Qgb2JqW05VTV07DQpzdGF0
aWMgZEpvaW50R3JvdXBJRCBjb250YWN0Z3JvdXA7DQpzdGF0aWMgaW50IHNlbGVjdGVkID0gLTE7
CS8vIHNlbGVjdGVkIG9iamVjdA0Kc3RhdGljIGRHZW9tSUQgcmFtcD0wOw0Kc3RhdGljIGRHZW9t
SUQgcmFtcDI9MDsNCg0KDQovLyB0aGlzIGlzIGNhbGxlZCBieSBkU3BhY2VDb2xsaWRlIHdoZW4g
dHdvIG9iamVjdHMgaW4gc3BhY2UgYXJlDQovLyBwb3RlbnRpYWxseSBjb2xsaWRpbmcuDQoNCnN0
YXRpYyB2b2lkIG5lYXJDYWxsYmFjayAodm9pZCAqZGF0YSwgZEdlb21JRCBvMSwgZEdlb21JRCBv
MikNCnsNCiAgaW50IGk7DQogIC8vIGlmIChvMS0+Ym9keSAmJiBvMi0+Ym9keSkgcmV0dXJuOw0K
DQogIC8vIGV4aXQgd2l0aG91dCBkb2luZyBhbnl0aGluZyBpZiB0aGUgdHdvIGJvZGllcyBhcmUg
Y29ubmVjdGVkIGJ5IGEgam9pbnQNCiAgZEJvZHlJRCBiMSA9IGRHZW9tR2V0Qm9keShvMSk7DQog
IGRCb2R5SUQgYjIgPSBkR2VvbUdldEJvZHkobzIpOw0KICBpZiAoYjEgJiYgYjIgJiYgZEFyZUNv
bm5lY3RlZCAoYjEsYjIpKSByZXR1cm47DQoNCiAgZENvbnRhY3QgY29udGFjdFszXTsJCQkvLyB1
cCB0byAzIGNvbnRhY3RzIHBlciBib3gNCiAgZm9yIChpPTA7IGk8MzsgaSsrKSB7DQogICAgY29u
dGFjdFtpXS5zdXJmYWNlLm1vZGUgPSBkQ29udGFjdEJvdW5jZTsgLy9kQ29udGFjdE11MjsNCiAg
ICBjb250YWN0W2ldLnN1cmZhY2UubXUgPSBkSW5maW5pdHk7DQogICAgY29udGFjdFtpXS5zdXJm
YWNlLm11MiA9IDA7DQogICAgY29udGFjdFtpXS5zdXJmYWNlLmJvdW5jZSA9IDAuNTsNCiAgICBj
b250YWN0W2ldLnN1cmZhY2UuYm91bmNlX3ZlbCA9IDAuMTsNCiAgfQ0KICBpZiAoaW50IG51bWMg
PSBkQ29sbGlkZSAobzEsbzIsMywmY29udGFjdFswXS5nZW9tLHNpemVvZihkQ29udGFjdCkpKSB7
DQogICAgLy8gZE1hdHJpeDMgUkk7DQogICAgLy8gZFJTZXRJZGVudGl0eSAoUkkpOw0KICAgIC8v
IGNvbnN0IGRSZWFsIHNzWzNdID0gezAuMDIsMC4wMiwwLjAyfTsNCiAgICBmb3IgKGk9MDsgaTxu
dW1jOyBpKyspIHsNCiAgICAgIGRKb2ludElEIGMgPSBkSm9pbnRDcmVhdGVDb250YWN0ICh3b3Js
ZCxjb250YWN0Z3JvdXAsY29udGFjdCtpKTsNCiAgICAgIGRKb2ludEF0dGFjaCAoYyxiMSxiMik7
DQogICAgICAvLyBkc0RyYXdCb3ggKGNvbnRhY3RbaV0uZ2VvbS5wb3MsUkksc3MpOw0KICAgIH0N
CiAgfQ0KfQ0KDQoNCi8vIHN0YXJ0IHNpbXVsYXRpb24gLSBzZXQgdmlld3BvaW50DQoNCnN0YXRp
YyB2b2lkIHN0YXJ0KCkNCnsNCiAgc3RhdGljIGZsb2F0IHh5elszXSA9IHsyLjE2NDBmLC0xLjMw
NzlmLDEuNzYwMGZ9Ow0KICBzdGF0aWMgZmxvYXQgaHByWzNdID0gezEyNS41MDAwZiwtMTcuMDAw
MGYsMC4wMDAwZn07DQogIGRzU2V0Vmlld3BvaW50ICh4eXosaHByKTsNCiAgcHJpbnRmICgiVG8g
ZHJvcCBhbm90aGVyIG9iamVjdCwgcHJlc3M6XG4iKTsNCiAgcHJpbnRmICgiICAgYiBmb3IgYm94
LlxuIik7DQogIHByaW50ZiAoIiAgIHMgZm9yIHNwaGVyZS5cbiIpOw0KICBwcmludGYgKCIgICBj
IGZvciBjeWxpbmRlci5cbiIpOw0KICBwcmludGYgKCIgICB4IGZvciBhIGNvbXBvc2l0ZSBvYmpl
Y3QuXG4iKTsNCiAgcHJpbnRmICgiVG8gc2VsZWN0IGFuIG9iamVjdCwgcHJlc3Mgc3BhY2UuXG4i
KTsNCiAgcHJpbnRmICgiVG8gZGlzYWJsZSB0aGUgc2VsZWN0ZWQgb2JqZWN0LCBwcmVzcyBkLlxu
Iik7DQogIHByaW50ZiAoIlRvIGVuYWJsZSB0aGUgc2VsZWN0ZWQgb2JqZWN0LCBwcmVzcyBlLlxu
Iik7DQp9DQoNCg0KY2hhciBsb2Nhc2UgKGNoYXIgYykNCnsNCiAgaWYgKGMgPj0gJ0EnICYmIGMg
PD0gJ1onKSByZXR1cm4gYyAtICgnYSctJ0EnKTsNCiAgZWxzZSByZXR1cm4gYzsNCn0NCg0KDQov
LyBjYWxsZWQgd2hlbiBhIGtleSBwcmVzc2VkDQoNCnN0YXRpYyB2b2lkIGNvbW1hbmQgKGludCBj
bWQpDQp7DQogIGludCBpLGosazsNCiAgZFJlYWwgc2lkZXNbM107DQogIGRNYXNzIG07DQoNCiAg
Y21kID0gbG9jYXNlIChjbWQpOw0KICBpZiAoY21kID09ICdiJyB8fCBjbWQgPT0gJ3MnIHx8IGNt
ZCA9PSAnYycgfHwgY21kID09ICd4Jykgew0KICAgIGlmIChudW0gPCBOVU0pIHsNCiAgICAgIGkg
PSBudW07DQogICAgICBudW0rKzsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICBpID0gbmV4dG9i
ajsNCiAgICAgIG5leHRvYmorKzsNCiAgICAgIGlmIChuZXh0b2JqID49IG51bSkgbmV4dG9iaiA9
IDA7DQoNCiAgICAgIC8vIGRlc3Ryb3kgdGhlIGJvZHkgYW5kIGdlb21zIGZvciBzbG90IGkNCiAg
ICAgIGRCb2R5RGVzdHJveSAob2JqW2ldLmJvZHkpOw0KICAgICAgZm9yIChrPTA7IGsgPCBHUEI7
IGsrKykgew0KCWlmIChvYmpbaV0uZ2VvbVtrXSkgZEdlb21EZXN0cm95IChvYmpbaV0uZ2VvbVtr
XSk7DQogICAgICB9DQogICAgICBtZW1zZXQgKCZvYmpbaV0sMCxzaXplb2Yob2JqW2ldKSk7DQog
ICAgfQ0KDQogICAgb2JqW2ldLmJvZHkgPSBkQm9keUNyZWF0ZSAod29ybGQpOw0KICAgIGZvciAo
az0wOyBrPDM7IGsrKykgc2lkZXNba10gPSBkUmFuZFJlYWwoKSowLjUrMC4xOw0KDQogICAgZEJv
ZHlTZXRQb3NpdGlvbiAob2JqW2ldLmJvZHksDQogICAgICAgICAgMS4xZiwgMC5mLA0KCQkgICAg
ICAvL2RSYW5kUmVhbCgpKjItMSxkUmFuZFJlYWwoKSoyLTEsDQogICAgICAgICAgZFJhbmRSZWFs
KCkrMSk7DQogICAgZE1hdHJpeDMgUjsNCiAgICBkUkZyb21BeGlzQW5kQW5nbGUgKFIsZFJhbmRS
ZWFsKCkqMi4wLTEuMCxkUmFuZFJlYWwoKSoyLjAtMS4wLA0KCQkJZFJhbmRSZWFsKCkqMi4wLTEu
MCxkUmFuZFJlYWwoKSoxMC4wLTUuMCk7DQogICAgZEJvZHlTZXRSb3RhdGlvbiAob2JqW2ldLmJv
ZHksUik7DQogICAgZEJvZHlTZXREYXRhIChvYmpbaV0uYm9keSwodm9pZCopIGkpOw0KDQogICAg
aWYgKGNtZCA9PSAnYicpIHsNCiAgICAgIGRNYXNzU2V0Qm94ICgmbSxERU5TSVRZLHNpZGVzWzBd
LHNpZGVzWzFdLHNpZGVzWzJdKTsNCiAgICAgIG9ialtpXS5nZW9tWzBdID0gZENyZWF0ZUJveCAo
c3BhY2Usc2lkZXNbMF0sc2lkZXNbMV0sc2lkZXNbMl0pOw0KICAgIH0NCiAgICBlbHNlIGlmIChj
bWQgPT0gJ2MnKSB7DQogICAgICBzaWRlc1swXSAqPSAwLjU7DQogICAgICBkTWFzc1NldENhcHBl
ZEN5bGluZGVyICgmbSxERU5TSVRZLDMsc2lkZXNbMF0sc2lkZXNbMV0pOw0KICAgICAgb2JqW2ld
Lmdlb21bMF0gPSBkQ3JlYXRlQ0N5bGluZGVyIChzcGFjZSxzaWRlc1swXSxzaWRlc1sxXSk7DQog
ICAgfQ0KICAgIGVsc2UgaWYgKGNtZCA9PSAncycpIHsNCiAgICAgIHNpZGVzWzBdICo9IDAuNTsN
CiAgICAgIGRNYXNzU2V0U3BoZXJlICgmbSxERU5TSVRZLHNpZGVzWzBdKTsNCiAgICAgIG9ialtp
XS5nZW9tWzBdID0gZENyZWF0ZVNwaGVyZSAoc3BhY2Usc2lkZXNbMF0pOw0KICAgIH0NCiAgICBl
bHNlIGlmIChjbWQgPT0gJ3gnKSB7DQogICAgICBkR2VvbUlEIGcyW0dQQl07CQkvLyBlbmNhcHN1
bGF0ZWQgZ2VvbWV0cmllcw0KICAgICAgZFJlYWwgZHBvc1tHUEJdWzNdOwkvLyBkZWx0YS1wb3Np
dGlvbnMgZm9yIGVuY2Fwc3VsYXRlZCBnZW9tZXRyaWVzDQoNCiAgICAgIC8vIHN0YXJ0IGFjY3Vt
dWxhdGluZyBtYXNzZXMgZm9yIHRoZSBlbmNhcHN1bGF0ZWQgZ2VvbWV0cmllcw0KICAgICAgZE1h
c3MgbTI7DQogICAgICBkTWFzc1NldFplcm8gKCZtKTsNCg0KICAgICAgLy8gc2V0IHJhbmRvbSBk
ZWx0YSBwb3NpdGlvbnMNCiAgICAgIGZvciAoaj0wOyBqPEdQQjsgaisrKSB7DQoJZm9yIChrPTA7
IGs8MzsgaysrKSBkcG9zW2pdW2tdID0gZFJhbmRSZWFsKCkqMC4zLTAuMTU7DQogICAgICB9DQoN
CiAgICAgIGZvciAoaz0wOyBrPDM7IGsrKykgew0KCW9ialtpXS5nZW9tW2tdID0gZENyZWF0ZUdl
b21UcmFuc2Zvcm0gKHNwYWNlKTsNCglkR2VvbVRyYW5zZm9ybVNldENsZWFudXAgKG9ialtpXS5n
ZW9tW2tdLDEpOw0KCWlmIChrPT0wKSB7DQoJICBkUmVhbCByYWRpdXMgPSBkUmFuZFJlYWwoKSow
LjI1KzAuMDU7DQoJICBnMltrXSA9IGRDcmVhdGVTcGhlcmUgKDAscmFkaXVzKTsNCgkgIGRNYXNz
U2V0U3BoZXJlICgmbTIsREVOU0lUWSxyYWRpdXMpOw0KCX0NCgllbHNlIGlmIChrPT0xKSB7DQoJ
ICBnMltrXSA9IGRDcmVhdGVCb3ggKDAsc2lkZXNbMF0sc2lkZXNbMV0sc2lkZXNbMl0pOw0KCSAg
ZE1hc3NTZXRCb3ggKCZtMixERU5TSVRZLHNpZGVzWzBdLHNpZGVzWzFdLHNpZGVzWzJdKTsNCgl9
DQoJZWxzZSB7DQoJICBkUmVhbCByYWRpdXMgPSBkUmFuZFJlYWwoKSowLjErMC4wNTsNCgkgIGRS
ZWFsIGxlbmd0aCA9IGRSYW5kUmVhbCgpKjEuMCswLjE7DQoJICBnMltrXSA9IGRDcmVhdGVDQ3ls
aW5kZXIgKDAscmFkaXVzLGxlbmd0aCk7DQoJICBkTWFzc1NldENhcHBlZEN5bGluZGVyICgmbTIs
REVOU0lUWSwzLHJhZGl1cyxsZW5ndGgpOw0KCX0NCglkR2VvbVRyYW5zZm9ybVNldEdlb20gKG9i
altpXS5nZW9tW2tdLGcyW2tdKTsNCg0KCS8vIHNldCB0aGUgdHJhbnNmb3JtYXRpb24gKGFkanVz
dCB0aGUgbWFzcyB0b28pDQoJZEdlb21TZXRQb3NpdGlvbiAoZzJba10sZHBvc1trXVswXSxkcG9z
W2tdWzFdLGRwb3Nba11bMl0pOw0KCWRNYXNzVHJhbnNsYXRlICgmbTIsZHBvc1trXVswXSxkcG9z
W2tdWzFdLGRwb3Nba11bMl0pOw0KCWRNYXRyaXgzIFJ0eDsNCglkUkZyb21BeGlzQW5kQW5nbGUg
KFJ0eCxkUmFuZFJlYWwoKSoyLjAtMS4wLGRSYW5kUmVhbCgpKjIuMC0xLjAsDQoJCQkgICAgZFJh
bmRSZWFsKCkqMi4wLTEuMCxkUmFuZFJlYWwoKSoxMC4wLTUuMCk7DQoJZEdlb21TZXRSb3RhdGlv
biAoZzJba10sUnR4KTsNCglkTWFzc1JvdGF0ZSAoJm0yLFJ0eCk7DQoNCgkvLyBhZGQgdG8gdGhl
IHRvdGFsIG1hc3MNCglkTWFzc0FkZCAoJm0sJm0yKTsNCiAgICAgIH0NCg0KICAgICAgLy8gbW92
ZSBhbGwgZW5jYXBzdWxhdGVkIG9iamVjdHMgc28gdGhhdCB0aGUgY2VudGVyIG9mIG1hc3MgaXMg
KDAsMCwwKQ0KICAgICAgZm9yIChrPTA7IGs8MjsgaysrKSB7DQoJZEdlb21TZXRQb3NpdGlvbiAo
ZzJba10sDQoJCQkgIGRwb3Nba11bMF0tbS5jWzBdLA0KCQkJICBkcG9zW2tdWzFdLW0uY1sxXSwN
CgkJCSAgZHBvc1trXVsyXS1tLmNbMl0pOw0KICAgICAgfQ0KICAgICAgZE1hc3NUcmFuc2xhdGUg
KCZtLC1tLmNbMF0sLW0uY1sxXSwtbS5jWzJdKTsNCiAgICB9DQoNCiAgICBmb3IgKGs9MDsgayA8
IEdQQjsgaysrKSB7DQogICAgICBpZiAob2JqW2ldLmdlb21ba10pIGRHZW9tU2V0Qm9keSAob2Jq
W2ldLmdlb21ba10sb2JqW2ldLmJvZHkpOw0KICAgIH0NCg0KICAgIGRCb2R5U2V0TWFzcyAob2Jq
W2ldLmJvZHksJm0pOw0KICB9DQoNCiAgaWYgKGNtZCA9PSAnICcpIHsNCiAgICBzZWxlY3RlZCsr
Ow0KICAgIGlmIChzZWxlY3RlZCA+PSBudW0pIHNlbGVjdGVkID0gMDsNCiAgICBpZiAoc2VsZWN0
ZWQgPCAwKSBzZWxlY3RlZCA9IDA7DQogIH0NCiAgZWxzZSBpZiAoY21kID09ICdkJyAmJiBzZWxl
Y3RlZCA+PSAwICYmIHNlbGVjdGVkIDwgbnVtKSB7DQogICAgZEJvZHlEaXNhYmxlIChvYmpbc2Vs
ZWN0ZWRdLmJvZHkpOw0KICB9DQogIGVsc2UgaWYgKGNtZCA9PSAnZScgJiYgc2VsZWN0ZWQgPj0g
MCAmJiBzZWxlY3RlZCA8IG51bSkgew0KICAgIGRCb2R5RW5hYmxlIChvYmpbc2VsZWN0ZWRdLmJv
ZHkpOw0KICB9DQp9DQoNCg0KLy8gZHJhdyBhIGdlb20NCg0Kdm9pZCBkcmF3R2VvbSAoZEdlb21J
RCBnLCBjb25zdCBkUmVhbCAqcG9zLCBjb25zdCBkUmVhbCAqUikNCnsNCiAgaWYgKCFnKSByZXR1
cm47DQogIGlmICghcG9zKSBwb3MgPSBkR2VvbUdldFBvc2l0aW9uIChnKTsNCiAgaWYgKCFSKSBS
ID0gZEdlb21HZXRSb3RhdGlvbiAoZyk7DQoNCiAgaW50IHR5cGUgPSBkR2VvbUdldENsYXNzIChn
KTsNCiAgaWYgKHR5cGUgPT0gZEJveENsYXNzKSB7DQogICAgZFZlY3RvcjMgc2lkZXM7DQogICAg
ZEdlb21Cb3hHZXRMZW5ndGhzIChnLHNpZGVzKTsNCiAgICBkc0RyYXdCb3ggKHBvcyxSLHNpZGVz
KTsNCiAgfQ0KICBlbHNlIGlmICh0eXBlID09IGRTcGhlcmVDbGFzcykgew0KICAgIGRzRHJhd1Nw
aGVyZSAocG9zLFIsZEdlb21TcGhlcmVHZXRSYWRpdXMgKGcpKTsNCiAgfQ0KICBlbHNlIGlmICh0
eXBlID09IGRDQ3lsaW5kZXJDbGFzcykgew0KICAgIGRSZWFsIHJhZGl1cyxsZW5ndGg7DQogICAg
ZEdlb21DQ3lsaW5kZXJHZXRQYXJhbXMgKGcsJnJhZGl1cywmbGVuZ3RoKTsNCiAgICBkc0RyYXdD
YXBwZWRDeWxpbmRlciAocG9zLFIsbGVuZ3RoLHJhZGl1cyk7DQogIH0NCiAgZWxzZSBpZiAodHlw
ZSA9PSBkR2VvbVRyYW5zZm9ybUNsYXNzKSB7DQogICAgZEdlb21JRCBnMiA9IGRHZW9tVHJhbnNm
b3JtR2V0R2VvbSAoZyk7DQogICAgY29uc3QgZFJlYWwgKnBvczIgPSBkR2VvbUdldFBvc2l0aW9u
IChnMik7DQogICAgY29uc3QgZFJlYWwgKlIyID0gZEdlb21HZXRSb3RhdGlvbiAoZzIpOw0KICAg
IGRWZWN0b3IzIGFjdHVhbF9wb3M7DQogICAgZE1hdHJpeDMgYWN0dWFsX1I7DQogICAgZE1VTFRJ
UExZMF8zMzEgKGFjdHVhbF9wb3MsUixwb3MyKTsNCiAgICBhY3R1YWxfcG9zWzBdICs9IHBvc1sw
XTsNCiAgICBhY3R1YWxfcG9zWzFdICs9IHBvc1sxXTsNCiAgICBhY3R1YWxfcG9zWzJdICs9IHBv
c1syXTsNCiAgICBkTVVMVElQTFkwXzMzMyAoYWN0dWFsX1IsUixSMik7DQogICAgZHJhd0dlb20g
KGcyLGFjdHVhbF9wb3MsYWN0dWFsX1IpOw0KICB9DQp9DQoNCg0KLy8gc2ltdWxhdGlvbiBsb29w
DQoNCnN0YXRpYyB2b2lkIHNpbUxvb3AgKGludCBwYXVzZSkNCnsNCiAgZHNTZXRDb2xvciAoMCww
LDIpOw0KICBkU3BhY2VDb2xsaWRlIChzcGFjZSwwLCZuZWFyQ2FsbGJhY2spOw0KICBpZiAoIXBh
dXNlKSBkV29ybGRTdGVwICh3b3JsZCwwLjA1KTsNCg0KICAvLyByZW1vdmUgYWxsIGNvbnRhY3Qg
am9pbnRzDQogIGRKb2ludEdyb3VwRW1wdHkgKGNvbnRhY3Rncm91cCk7DQoNCiAgZHNTZXRDb2xv
ciAoMSwxLDApOw0KICBkc1NldFRleHR1cmUgKERTX1dPT0QpOw0KICBkcmF3R2VvbShyYW1wLDAs
MCk7DQogIGRyYXdHZW9tKHJhbXAyLDAsMCk7DQoNCiAgZm9yIChpbnQgaT0wOyBpPG51bTsgaSsr
KSB7DQogICAgaW50IGNvbG9yX2NoYW5nZWQgPSAwOw0KICAgIGlmIChpPT1zZWxlY3RlZCkgew0K
ICAgICAgZHNTZXRDb2xvciAoMCwwLjcsMSk7DQogICAgICBjb2xvcl9jaGFuZ2VkID0gMTsNCiAg
ICB9DQogICAgZWxzZSBpZiAoISBkQm9keUlzRW5hYmxlZCAob2JqW2ldLmJvZHkpKSB7DQogICAg
ICBkc1NldENvbG9yICgxLDAsMCk7DQogICAgICBjb2xvcl9jaGFuZ2VkID0gMTsNCiAgICB9DQog
ICAgZm9yIChpbnQgaj0wOyBqIDwgR1BCOyBqKyspIGRyYXdHZW9tIChvYmpbaV0uZ2VvbVtqXSww
LDApOw0KICAgIGlmIChjb2xvcl9jaGFuZ2VkKSBkc1NldENvbG9yICgxLDEsMCk7DQogIH0NCn0N
Cg0KDQppbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0Kew0KICAvLyBzZXR1cCBwb2lu
dGVycyB0byBkcmF3c3R1ZmYgY2FsbGJhY2sgZnVuY3Rpb25zDQogIGRzRnVuY3Rpb25zIGZuOw0K
ICBmbi52ZXJzaW9uID0gRFNfVkVSU0lPTjsNCiAgZm4uc3RhcnQgPSAmc3RhcnQ7DQogIGZuLnN0
ZXAgPSAmc2ltTG9vcDsNCiAgZm4uY29tbWFuZCA9ICZjb21tYW5kOw0KICBmbi5zdG9wID0gMDsN
CiAgZm4ucGF0aF90b190ZXh0dXJlcyA9ICIuLi8uLi9kcmF3c3R1ZmYvdGV4dHVyZXMiOw0KDQog
IC8vIGNyZWF0ZSB3b3JsZA0KDQogIHdvcmxkID0gZFdvcmxkQ3JlYXRlKCk7DQogIHNwYWNlID0g
ZEhhc2hTcGFjZUNyZWF0ZSgpOw0KICBjb250YWN0Z3JvdXAgPSBkSm9pbnRHcm91cENyZWF0ZSAo
MCk7DQogIGRXb3JsZFNldEdyYXZpdHkgKHdvcmxkLDAsMCwtMC41KTsNCiAgZFdvcmxkU2V0Q0ZN
ICh3b3JsZCwxZS01KTsNCiAgZENyZWF0ZVBsYW5lIChzcGFjZSwwLDAsMSwwKTsNCiAgbWVtc2V0
IChvYmosMCxzaXplb2Yob2JqKSk7DQoNCiAgLy8gY3JlYXRlIHJhbXANCiAgcmFtcCA9IGRDcmVh
dGVCb3ggKHNwYWNlLCAyLmYsIDIuZiwgMC4xZik7DQoJZEdlb21TZXRQb3NpdGlvbiAocmFtcCwg
MC5mLCAwLmYsIDAuZik7DQoJZE1hdHJpeDMgUjsNCglkUkZyb21BeGlzQW5kQW5nbGUgKFIsIDAu
ZiwgMS5mLCAwLmYsIE1fUEkvNC5mKTsNCglkR2VvbVNldFJvdGF0aW9uIChyYW1wLFIpOw0KDQog
IHJhbXAyID0gZENyZWF0ZUJveCAoc3BhY2UsIDIuZiwgMi5mLCAwLjFmKTsNCglkR2VvbVNldFBv
c2l0aW9uIChyYW1wMiwgMS5mLCAwLmYsIDAuZik7DQoJZFJGcm9tQXhpc0FuZEFuZ2xlIChSLCAw
LmYsIDEuZiwgMC5mLCAtTV9QSS84LmYpOw0KCWRHZW9tU2V0Um90YXRpb24gKHJhbXAyLFIpOw0K
DQogIC8vIHJ1biBzaW11bGF0aW9uDQogIGRzU2ltdWxhdGlvbkxvb3AgKGFyZ2MsYXJndiwzNTIs
Mjg4LCZmbik7DQoNCiAgZEpvaW50R3JvdXBEZXN0cm95IChjb250YWN0Z3JvdXApOw0KICBkU3Bh
Y2VEZXN0cm95IChzcGFjZSk7DQogIGRXb3JsZERlc3Ryb3kgKHdvcmxkKTsNCg0KICByZXR1cm4g
MDsNCn0NCg==

------_=_NextPart_001_01C27EE9.1ED0102A--