[Mono-list] [PATCH] BitVector32

Andrew Birkett adb@tardis.ed.ac.uk
Mon, 24 Jun 2002 12:21:01 +0100 (BST)


  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.

---559023410-851401618-1024917661=:19519
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hi,

I've got a few mono patches lined up today.  I did a big cycle ride on
Saturday and didn't want to move on Sunday so I got lots of coding done!

I've attached a further patch for BitVector32, created against the current
cvs version.  The patch contains:

 - Unit test for section indexers
 - Check for >32 bits when creating sections
 - Factored out helper methods for bit twiddling operations.
 - Removed ^M's from BitVector32Test.cs

Unit tests pass, except those which were already broken prior to my
changes.  The failures are all in date/time classes, due to me being in
the GMT time zone.  I'll have a look at fixing those later.

Andrew

- www.tardis.ed.ac.uk/~adb -

---559023410-851401618-1024917661=:19519
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=bitvector-patch
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.GS4.4.33.0206241221010.19519@davros.tardis.ed.ac.uk>
Content-Description: 
Content-Disposition: attachment; filename=bitvector-patch

SW5kZXg6IFN5c3RlbS9TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQv
Qml0VmVjdG9yMzIuY3MNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBm
aWxlOiAvbW9uby9tY3MvY2xhc3MvU3lzdGVtL1N5c3RlbS5Db2xsZWN0aW9u
cy5TcGVjaWFsaXplZC9CaXRWZWN0b3IzMi5jcyx2DQpyZXRyaWV2aW5nIHJl
dmlzaW9uIDEuNQ0KZGlmZiAtdSAtcjEuNSBCaXRWZWN0b3IzMi5jcw0KLS0t
IFN5c3RlbS9TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQvQml0VmVj
dG9yMzIuY3MJMjEgSnVuIDIwMDIgMTg6MTI6MDMgLTAwMDAJMS41DQorKysg
U3lzdGVtL1N5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC9CaXRWZWN0
b3IzMi5jcwkyNCBKdW4gMjAwMiAxMTowNjo0NSAtMDAwMA0KQEAgLTQsNiAr
NCw3IEBADQogLy8gQXV0aG9yOg0KIC8vICAgTWlndWVsIGRlIEljYXphICht
aWd1ZWxAeGltaWFuLmNvbSkNCiAvLyAgIExhd3JlbmNlIFBpdCAobG96QGNh
YmxlLmEyMDAwLm5sKQ0KKy8vICAgQW5kcmV3IEJpcmtldHQgKGFkYkB0YXJk
aXMuZWQuYWMudWspDQogLy8NCiAvLyAoQykgWGltaWFuLCBJbmMuICBodHRw
Oi8vd3d3LnhpbWlhbi5jb20NCiAvLw0KQEAgLTEyOCwyNSArMTI5LDE1IEBA
DQogCQkJaWYgKG1heFZhbHVlIDwgMSkNCiAJCQkJdGhyb3cgbmV3IEFyZ3Vt
ZW50RXhjZXB0aW9uICgibWF4VmFsdWUiKTsNCiAJCQkNCi0JCQlpbnQgbmV3
bWFzayA9IChpbnQpIG1heFZhbHVlOw0KLQkJCWludCBtYXNrID0gMHg4MDAw
Ow0KLQkJCXdoaWxlICgobmV3bWFzayAmIG1hc2spID09IDApDQotCQkJCW1h
c2sgPj49IDE7DQotCQkJd2hpbGUgKG1hc2sgPiAwKSB7DQotCQkJCW5ld21h
c2sgfD0gbWFzazsNCi0JCQkJbWFzayA+Pj0gMTsNCi0JCQl9DQorCQkJaW50
IGJpdCA9IEhpZ2hlc3RTZXRCaXQobWF4VmFsdWUpICsgMTsNCisJCQlpbnQg
bWFzayA9ICgxIDw8IGJpdCkgLSAxOw0KKwkJCWludCBvZmZzZXQgPSBwcmV2
aW91cy5PZmZzZXQgKyBOdW1iZXJPZlNldEJpdHMgKHByZXZpb3VzLk1hc2sp
Ow0KIA0KLQkJCXNob3J0IGNvdW50ID0gMDsNCi0JCQlpbnQgcHJldiA9IHBy
ZXZpb3VzLk1hc2s7DQotCQkJbWFzayA9IDB4ODAwMDsNCi0JCQl3aGlsZSAo
bWFzayA+IDApIHsNCi0JCQkJaWYgKChwcmV2ICYgbWFzaykgIT0gMCkNCi0J
CQkJCWNvdW50Kys7DQotCQkJCW1hc2sgPj49IDE7DQorCQkJaWYgKG9mZnNl
dCArIE51bWJlck9mU2V0Qml0cyAobWFzaykgPiAzMikgew0KKwkJCQl0aHJv
dyBuZXcgQXJndW1lbnRFeGNlcHRpb24gKCJTZWN0aW9ucyBjYW5ub3QgZXhj
ZWVkIDMyIGJpdHMgaW4gdG90YWwiKTsNCiAJCQl9DQogDQotCQkJcmV0dXJu
IG5ldyBTZWN0aW9uICgoc2hvcnQpIG5ld21hc2ssIChzaG9ydCkgKHByZXZp
b3VzLk9mZnNldCArIGNvdW50KSk7DQorCQkJcmV0dXJuIG5ldyBTZWN0aW9u
ICgoc2hvcnQpIG1hc2ssIChzaG9ydCkgb2Zmc2V0KTsNCiAJCX0NCiAJCQ0K
IAkJcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzIChvYmplY3QgbykNCkBA
IC0xNzksNSArMTcwLDMwIEBADQogCQkJYi5BcHBlbmQgKCd9Jyk7DQogCQkJ
cmV0dXJuIGIuVG9TdHJpbmcgKCk7DQogCQl9DQorDQorCQkvLyBQcml2YXRl
IHV0aWxpdGllcw0KKwkJcHJpdmF0ZSBzdGF0aWMgaW50IE51bWJlck9mU2V0
Qml0cyAoaW50IGkpIA0KKwkJew0KKwkJCWludCBjb3VudCA9IDA7DQorCQkJ
Zm9yIChpbnQgYml0ID0gMDsgYml0IDwgMzI7IGJpdCsrKSB7DQorCQkJCWlu
dCBtYXNrID0gMSA8PCBiaXQ7DQorCQkJCWlmICgoaSAmIG1hc2spICE9IDAp
IA0KKwkJCQkJY291bnQrKzsNCisJCQl9DQorCQkJcmV0dXJuIGNvdW50Ow0K
KwkJfQ0KKw0KKwkJcHJpdmF0ZSBzdGF0aWMgaW50IEhpZ2hlc3RTZXRCaXQg
KGludCBpKSANCisJCXsNCisJCQlmb3IgKGludCBiaXQgPSAzMTsgYml0ID49
IDA7IGJpdC0tKSB7DQorCQkJCWludCBtYXNrID0gMSA8PCBiaXQ7DQorCQkJ
CWlmICgobWFzayAmIGkpICE9IDApIHsNCisJCQkJCXJldHVybiBiaXQ7DQor
CQkJCX0NCisJCQl9DQorDQorCQkJcmV0dXJuIC0xOw0KKwkJfQ0KKw0KIAl9
DQogfQ0KSW5kZXg6IFN5c3RlbS9TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lh
bGl6ZWQvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1Mg
ZmlsZTogL21vbm8vbWNzL2NsYXNzL1N5c3RlbS9TeXN0ZW0uQ29sbGVjdGlv
bnMuU3BlY2lhbGl6ZWQvQ2hhbmdlTG9nLHYNCnJldHJpZXZpbmcgcmV2aXNp
b24gMS4xMA0KZGlmZiAtdSAtcjEuMTAgQ2hhbmdlTG9nDQotLS0gU3lzdGVt
L1N5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXplZC9DaGFuZ2VMb2cJMTEg
TWF5IDIwMDIgMjE6MjY6NDYgLTAwMDAJMS4xMA0KKysrIFN5c3RlbS9TeXN0
ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQvQ2hhbmdlTG9nCTI0IEp1biAy
MDAyIDExOjA2OjQ1IC0wMDAwDQpAQCAtMSwzICsxLDggQEANCisyMDAyLTA2
LTI0ICBBbmRyZXcgQmlya2V0dCA8YWRiQHRhcmRpcy5lZC5hYy51az4NCisN
CisJKiBCaXRWZWN0b3IzMi5jczogSW1wbGVtZW50ZWQgJ3NldCcgc2VjdGlv
biBpbmRleGVyLiAgQ2hlY2sgZm9yDQorCW92ZXJseSBsYXJnZSBzZWN0aW9u
cy4JRmFjdG9yZWQgb3V0IHNvbWUgaGVscGVyIG1ldGhvZHMuIA0KKw0KIDIw
MDItMDUtMTEgIExhd3JlbmNlIFBpdCA8bG96QGNhYmxlLmEyMDAwLm5sPg0K
IA0KIAkqIE5hbWVWYWx1ZUNvbGxlY3Rpb24uQXNTdHJpbmdBcnJheTogZml4
ZWQgQXJndW1lbnROdWxsRXhjZXB0aW9uIGJ1Zy4NCkluZGV4OiBTeXN0ZW0v
VGVzdC9TeXN0ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQvQml0VmVjdG9y
MzJUZXN0LmNzDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTog
L21vbm8vbWNzL2NsYXNzL1N5c3RlbS9UZXN0L1N5c3RlbS5Db2xsZWN0aW9u
cy5TcGVjaWFsaXplZC9CaXRWZWN0b3IzMlRlc3QuY3Msdg0KcmV0cmlldmlu
ZyByZXZpc2lvbiAxLjENCmRpZmYgLXUgLXIxLjEgQml0VmVjdG9yMzJUZXN0
LmNzDQotLS0gU3lzdGVtL1Rlc3QvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNp
YWxpemVkL0JpdFZlY3RvcjMyVGVzdC5jcwk5IE1heSAyMDAyIDIwOjA1OjMz
IC0wMDAwCTEuMQ0KKysrIFN5c3RlbS9UZXN0L1N5c3RlbS5Db2xsZWN0aW9u
cy5TcGVjaWFsaXplZC9CaXRWZWN0b3IzMlRlc3QuY3MJMjQgSnVuIDIwMDIg
MTE6MDY6NDUgLTAwMDANCkBAIC0xLDE0MCArMSwxNzggQEANCi0vLw0KLS8v
IEJpdFZlY3RvcjMyVGVzdC5jcyAtIE5Vbml0IFRlc3QgQ2FzZXMgZm9yIFN5
c3RlbS5OZXQuQml0VmVjdG9yMzINCi0vLw0KLS8vIEF1dGhvcjoNCi0vLyAg
IExhd3JlbmNlIFBpdCAobG96QGNhYmxlLmEyMDAwLm5sKQ0KLS8vDQotDQot
dXNpbmcgTlVuaXQuRnJhbWV3b3JrOw0KLXVzaW5nIFN5c3RlbTsNCi11c2lu
ZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQotdXNpbmcgU3lzdGVtLkNvbGxlY3Rp
b25zLlNwZWNpYWxpemVkOw0KLQ0KLW5hbWVzcGFjZSBNb25vVGVzdHMuU3lz
dGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkDQotew0KLQlwdWJsaWMgY2xh
c3MgQml0VmVjdG9yMzJUZXN0IDogVGVzdENhc2UNCi0Jew0KLQkJcHVibGlj
IEJpdFZlY3RvcjMyVGVzdCAoKSA6DQotCQkJYmFzZSAoIltNb25vVGVzdHMu
U3lzdGVtLk5ldC5CaXRWZWN0b3IzMlRlc3RdIikge30NCi0NCi0JCXB1Ymxp
YyBCaXRWZWN0b3IzMlRlc3QgKHN0cmluZyBuYW1lKSA6IGJhc2UgKG5hbWUp
IHt9DQotDQotCQlwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBTZXRVcCAoKSB7
fQ0KLQ0KLQkJcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgVGVhckRvd24gKCkg
e30NCi0NCi0JCXB1YmxpYyBzdGF0aWMgSVRlc3QgU3VpdGUNCi0JCXsNCi0J
CQlnZXQgew0KLQkJCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZSAodHlwZW9mIChC
aXRWZWN0b3IzMlRlc3QpKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXB1Ymxp
YyB2b2lkIFRlc3RDb25zdHJ1Y3RvcnMgKCkNCi0JCXsNCi0JCQlCaXRWZWN0
b3IzMiBiID0gbmV3IEJpdFZlY3RvcjMyICgzMSk7DQotCQl9DQotCQkNCi0J
CXB1YmxpYyB2b2lkIFRlc3RJbmRleGVycyAoKQ0KLQkJew0KLQkJCUJpdFZl
Y3RvcjMyIGIgPSBuZXcgQml0VmVjdG9yMzIgKDcpOw0KLQkJCUFzc2VydCAo
IiMxIiwgYiBbMF0pOw0KLQkJCUFzc2VydCAoIiMyIiwgYiBbMV0pOw0KLQkJ
CUFzc2VydCAoIiMzIiwgYiBbMl0pOw0KLQkJCUFzc2VydCAoIiM0IiwgYiBb
NF0pOw0KLQkJCUFzc2VydCAoIiM1IiwgIWIgWzhdKTsNCi0JCQlBc3NlcnQg
KCIjNiIsICFiIFsxNl0pOw0KLQkJCWIgWzhdID0gdHJ1ZTsNCi0JCQlBc3Nl
cnQgKCIjNyIsIGIgWzRdKTsNCi0JCQlBc3NlcnQgKCIjOCIsIGIgWzhdKTsN
Ci0JCQlBc3NlcnQgKCIjOSIsICFiIFsxNl0pOw0KLQkJCWIgWzhdID0gZmFs
c2U7DQotCQkJQXNzZXJ0ICgiIzEwIiwgYiBbNF0pOw0KLQkJCUFzc2VydCAo
IiMxMSIsICFiIFs4XSk7DQotCQkJQXNzZXJ0ICgiIzEyIiwgIWIgWzE2XSk7
DQotDQotCQkJQml0VmVjdG9yMzIuU2VjdGlvbiBzID0gQml0VmVjdG9yMzIu
Q3JlYXRlU2VjdGlvbiAoMzEpOw0KLQkJCXMgPSBCaXRWZWN0b3IzMi5DcmVh
dGVTZWN0aW9uICg2NCwgcyk7DQotCQkJLy8gUHJpbnQgKHMpOw0KLQkJCQ0K
LQkJCS8vIGIgPSBuZXcgQml0VmVjdG9yMzIgKDB4Nzc3Nzc3KTsNCi0JCQlC
aXRWZWN0b3IzMiBiMSA9IG5ldyBCaXRWZWN0b3IzMiAoMHhmZmZmNzcpOw0K
LQkJCUJpdFZlY3RvcjMyIGIyID0gbmV3IEJpdFZlY3RvcjMyIChiMSBbc10p
Ow0KLQkJCS8vQ29uc29sZS5Xcml0ZUxpbmUgKGIxLlRvU3RyaW5nICgpKTsN
Ci0JCQkvL0NvbnNvbGUuV3JpdGVMaW5lIChiMi5Ub1N0cmluZyAoKSk7DQot
CQkJQXNzZXJ0RXF1YWxzICgiIzE0IiwgMTIzLCBiMSBbc10pOw0KLQkJCQ0K
LQkJCS8vIGIxIFtzXSA9IDE1Ow0KLQkJCS8vQ29uc29sZS5Xcml0ZUxpbmUg
KGIxLlRvU3RyaW5nICgpKTsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIFRl
c3RDcmVhdGVNYXNrICgpDQotCQl7DQotCQkJQXNzZXJ0RXF1YWxzICgiIzEi
LCAxLCBCaXRWZWN0b3IzMi5DcmVhdGVNYXNrICgpKTsNCi0JCQlBc3NlcnRF
cXVhbHMgKCIjMiIsIDEsIEJpdFZlY3RvcjMyLkNyZWF0ZU1hc2sgKDApKTsN
Ci0JCQlBc3NlcnRFcXVhbHMgKCIjMyIsIDIsIEJpdFZlY3RvcjMyLkNyZWF0
ZU1hc2sgKDEpKTsNCi0JCQlBc3NlcnRFcXVhbHMgKCIjNCIsIDMyLCBCaXRW
ZWN0b3IzMi5DcmVhdGVNYXNrICgxNikpOw0KLQkJCUFzc2VydEVxdWFscyAo
IiM2IiwgLTIsIEJpdFZlY3RvcjMyLkNyZWF0ZU1hc2sgKEludDMyLk1heFZh
bHVlKSk7DQotCQkJQXNzZXJ0RXF1YWxzICgiIzUiLCAtNCwgQml0VmVjdG9y
MzIuQ3JlYXRlTWFzayAoLTIpKTsNCi0JCQl0cnkgew0KLQkJCQlCaXRWZWN0
b3IzMi5DcmVhdGVNYXNrIChJbnQzMi5NaW5WYWx1ZSk7DQotCQkJCUZhaWwg
KCIjNyIpOw0KLQkJCX0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb25FeGNlcHRp
b24pIHt9CQkJDQotCQl9DQotCQkNCi0JCXB1YmxpYyB2b2lkIFRlc3RDcmVh
dGVTZWN0aW9uICgpDQotCQl7DQotCQkJQml0VmVjdG9yMzIuU2VjdGlvbiBz
ID0gQml0VmVjdG9yMzIuQ3JlYXRlU2VjdGlvbiAoMSk7DQotCQkJQXNzZXJ0
RXF1YWxzICgiIzEiLCAoc2hvcnQpIDEsIHMuTWFzayk7DQotDQotCQkJcyA9
IEJpdFZlY3RvcjMyLkNyZWF0ZVNlY3Rpb24gKDIpOw0KLQkJCUFzc2VydEVx
dWFscyAoIiMyIiwgKHNob3J0KSAzLCBzLk1hc2spOw0KLQ0KLQkJCXMgPSBC
aXRWZWN0b3IzMi5DcmVhdGVTZWN0aW9uICgzKTsNCi0JCQlBc3NlcnRFcXVh
bHMgKCIjMyIsIChzaG9ydCkgMywgcy5NYXNrKTsNCi0NCi0JCQlzID0gQml0
VmVjdG9yMzIuQ3JlYXRlU2VjdGlvbiAoNSk7DQotCQkJQXNzZXJ0RXF1YWxz
ICgiIzQiLCAoc2hvcnQpIDcsIHMuTWFzayk7DQotCQkJDQotCQkJcyA9IEJp
dFZlY3RvcjMyLkNyZWF0ZVNlY3Rpb24gKDIwKTsNCi0JCQlBc3NlcnRFcXVh
bHMgKCIjNCIsIChzaG9ydCkgMHgxZiwgcy5NYXNrKTsNCi0NCi0JCQlzID0g
Qml0VmVjdG9yMzIuQ3JlYXRlU2VjdGlvbiAoSW50MTYuTWF4VmFsdWUpOw0K
LQkJCUFzc2VydEVxdWFscyAoIiM1IiwgKHNob3J0KSAweDdmZmYsIHMuTWFz
ayk7DQotDQotCQkJcyA9IEJpdFZlY3RvcjMyLkNyZWF0ZVNlY3Rpb24gKElu
dDE2Lk1heFZhbHVlIC0gMTAwKTsNCi0JCQlBc3NlcnRFcXVhbHMgKCIjNiIs
IChzaG9ydCkgMHg3ZmZmLCBzLk1hc2spOw0KLQ0KLQkJCXRyeSB7DQotCQkJ
CUJpdFZlY3RvcjMyLlNlY3Rpb24gczIgPSBCaXRWZWN0b3IzMi5DcmVhdGVT
ZWN0aW9uICgwKTsNCi0JCQkJRmFpbCAoIiM3Iik7DQotCQkJfSBjYXRjaCAo
QXJndW1lbnRFeGNlcHRpb24pIHt9DQotDQotCQkJdHJ5IHsNCi0JCQkJQml0
VmVjdG9yMzIuU2VjdGlvbiBzMiA9IEJpdFZlY3RvcjMyLkNyZWF0ZVNlY3Rp
b24gKC0xKTsNCi0JCQkJRmFpbCAoIiM4Iik7DQotCQkJfSBjYXRjaCAoQXJn
dW1lbnRFeGNlcHRpb24pIHt9DQotDQotCQkJdHJ5IHsNCi0JCQkJQml0VmVj
dG9yMzIuU2VjdGlvbiBzMiA9IEJpdFZlY3RvcjMyLkNyZWF0ZVNlY3Rpb24g
KEludDE2Lk1pblZhbHVlKTsNCi0JCQkJRmFpbCAoIiM5Iik7DQotCQkJfSBj
YXRjaCAoQXJndW1lbnRFeGNlcHRpb24pIHt9DQotCQkJDQotCQkJcyA9IEJp
dFZlY3RvcjMyLkNyZWF0ZVNlY3Rpb24gKDIwKTsNCi0JCQlBc3NlcnRFcXVh
bHMgKCIjMTBhIiwgKHNob3J0KSAweDFmLCBzLk1hc2spOw0KLQkJCUFzc2Vy
dEVxdWFscyAoIiMxMGIiLCAoc2hvcnQpIDB4MDAsIHMuT2Zmc2V0KTsJCQkN
Ci0JCQlzID0gQml0VmVjdG9yMzIuQ3JlYXRlU2VjdGlvbiAoMTIwLCBzKTsN
Ci0JCQlBc3NlcnRFcXVhbHMgKCIjMTBjIiwgKHNob3J0KSAweDdmLCBzLk1h
c2spOw0KLQkJCUFzc2VydEVxdWFscyAoIiMxMGQiLCAoc2hvcnQpIDB4MDUs
IHMuT2Zmc2V0KTsJCQkJCQ0KLQkJCXMgPSBCaXRWZWN0b3IzMi5DcmVhdGVT
ZWN0aW9uICgxMDAwLCBzKTsNCi0JCQlBc3NlcnRFcXVhbHMgKCIjMTBlIiwg
KHNob3J0KSAweDNmZiwgcy5NYXNrKTsNCi0JCQlBc3NlcnRFcXVhbHMgKCIj
MTBmIiwgKHNob3J0KSAweDBjLCBzLk9mZnNldCk7CQkJDQotCQl9DQotDQot
DQotCQlwcml2YXRlIHZvaWQgUHJpbnQgKEJpdFZlY3RvcjMyLlNlY3Rpb24g
cykNCi0JCXsNCi0JCQlDb25zb2xlLldyaXRlTGluZSAocy5Ub1N0cmluZyAo
KSArICIgOiAiKyBzLk1hc2sgKyAiIDogIiArIHMuT2Zmc2V0KTsNCi0JCX0N
Ci0JfSAgICAgICAgDQorLy8NCisvLyBCaXRWZWN0b3IzMlRlc3QuY3MgLSBO
VW5pdCBUZXN0IENhc2VzIGZvciBTeXN0ZW0uTmV0LkJpdFZlY3RvcjMyDQor
Ly8NCisvLyBBdXRob3I6DQorLy8gICBMYXdyZW5jZSBQaXQgKGxvekBjYWJs
ZS5hMjAwMC5ubCkNCisvLyAgIEFuZHJldyBCaXJrZXR0IChhZGJAdGFyZGlz
LmVkLmFjLnVrKQ0KKy8vDQorDQordXNpbmcgTlVuaXQuRnJhbWV3b3JrOw0K
K3VzaW5nIFN5c3RlbTsNCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7DQor
dXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVkOw0KKw0KK25h
bWVzcGFjZSBNb25vVGVzdHMuU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxp
emVkDQorew0KKwlwdWJsaWMgY2xhc3MgQml0VmVjdG9yMzJUZXN0IDogVGVz
dENhc2UNCisJew0KKwkJcHVibGljIEJpdFZlY3RvcjMyVGVzdCAoKSA6DQor
CQkJYmFzZSAoIltNb25vVGVzdHMuU3lzdGVtLk5ldC5CaXRWZWN0b3IzMlRl
c3RdIikge30NCisNCisJCXB1YmxpYyBCaXRWZWN0b3IzMlRlc3QgKHN0cmlu
ZyBuYW1lKSA6IGJhc2UgKG5hbWUpIHt9DQorDQorCQlwcm90ZWN0ZWQgb3Zl
cnJpZGUgdm9pZCBTZXRVcCAoKSB7fQ0KKw0KKwkJcHJvdGVjdGVkIG92ZXJy
aWRlIHZvaWQgVGVhckRvd24gKCkge30NCisNCisJCXB1YmxpYyBzdGF0aWMg
SVRlc3QgU3VpdGUNCisJCXsNCisJCQlnZXQgew0KKwkJCQlyZXR1cm4gbmV3
IFRlc3RTdWl0ZSAodHlwZW9mIChCaXRWZWN0b3IzMlRlc3QpKTsNCisJCQl9
DQorCQl9DQorCQkNCisJCXB1YmxpYyB2b2lkIFRlc3RDb25zdHJ1Y3RvcnMg
KCkNCisJCXsNCisJCQlCaXRWZWN0b3IzMiBiID0gbmV3IEJpdFZlY3RvcjMy
ICgzMSk7DQorCQl9DQorCQkNCisJCXB1YmxpYyB2b2lkIFRlc3RJbmRleGVy
cyAoKQ0KKwkJew0KKwkJCUJpdFZlY3RvcjMyIGIgPSBuZXcgQml0VmVjdG9y
MzIgKDcpOw0KKwkJCUFzc2VydCAoIiMxIiwgYiBbMF0pOw0KKwkJCUFzc2Vy
dCAoIiMyIiwgYiBbMV0pOw0KKwkJCUFzc2VydCAoIiMzIiwgYiBbMl0pOw0K
KwkJCUFzc2VydCAoIiM0IiwgYiBbNF0pOw0KKwkJCUFzc2VydCAoIiM1Iiwg
IWIgWzhdKTsNCisJCQlBc3NlcnQgKCIjNiIsICFiIFsxNl0pOw0KKwkJCWIg
WzhdID0gdHJ1ZTsNCisJCQlBc3NlcnQgKCIjNyIsIGIgWzRdKTsNCisJCQlB
c3NlcnQgKCIjOCIsIGIgWzhdKTsNCisJCQlBc3NlcnQgKCIjOSIsICFiIFsx
Nl0pOw0KKwkJCWIgWzhdID0gZmFsc2U7DQorCQkJQXNzZXJ0ICgiIzEwIiwg
YiBbNF0pOw0KKwkJCUFzc2VydCAoIiMxMSIsICFiIFs4XSk7DQorCQkJQXNz
ZXJ0ICgiIzEyIiwgIWIgWzE2XSk7DQorDQorCQkJQml0VmVjdG9yMzIuU2Vj
dGlvbiBzID0gQml0VmVjdG9yMzIuQ3JlYXRlU2VjdGlvbiAoMzEpOw0KKwkJ
CXMgPSBCaXRWZWN0b3IzMi5DcmVhdGVTZWN0aW9uICg2NCwgcyk7DQorCQkJ
DQorCQkJQml0VmVjdG9yMzIgYjEgPSBuZXcgQml0VmVjdG9yMzIgKDB4ZmZm
Zjc3KTsNCisJCQlCaXRWZWN0b3IzMiBiMiA9IG5ldyBCaXRWZWN0b3IzMiAo
YjEgW3NdKTsNCisNCisJCQlBc3NlcnRFcXVhbHMgKCIjMTQiLCAxMjMsIGIx
IFtzXSk7DQorCQl9DQorDQorCQlwdWJsaWMgdm9pZCBUZXN0Q3JlYXRlTWFz
ayAoKQ0KKwkJew0KKwkJCUFzc2VydEVxdWFscyAoIiMxIiwgMSwgQml0VmVj
dG9yMzIuQ3JlYXRlTWFzayAoKSk7DQorCQkJQXNzZXJ0RXF1YWxzICgiIzIi
LCAxLCBCaXRWZWN0b3IzMi5DcmVhdGVNYXNrICgwKSk7DQorCQkJQXNzZXJ0
RXF1YWxzICgiIzMiLCAyLCBCaXRWZWN0b3IzMi5DcmVhdGVNYXNrICgxKSk7
DQorCQkJQXNzZXJ0RXF1YWxzICgiIzQiLCAzMiwgQml0VmVjdG9yMzIuQ3Jl
YXRlTWFzayAoMTYpKTsNCisJCQlBc3NlcnRFcXVhbHMgKCIjNiIsIC0yLCBC
aXRWZWN0b3IzMi5DcmVhdGVNYXNrIChJbnQzMi5NYXhWYWx1ZSkpOw0KKwkJ
CUFzc2VydEVxdWFscyAoIiM1IiwgLTQsIEJpdFZlY3RvcjMyLkNyZWF0ZU1h
c2sgKC0yKSk7DQorCQkJdHJ5IHsNCisJCQkJQml0VmVjdG9yMzIuQ3JlYXRl
TWFzayAoSW50MzIuTWluVmFsdWUpOw0KKwkJCQlGYWlsICgiIzciKTsNCisJ
CQl9IGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKSB7fQkJCQ0K
KwkJfQ0KKwkJDQorCQlwdWJsaWMgdm9pZCBUZXN0Q3JlYXRlU2VjdGlvbiAo
KQ0KKwkJew0KKwkJCUJpdFZlY3RvcjMyLlNlY3Rpb24gcyA9IEJpdFZlY3Rv
cjMyLkNyZWF0ZVNlY3Rpb24gKDEpOw0KKwkJCUFzc2VydEVxdWFscyAoIiMx
IiwgKHNob3J0KSAxLCBzLk1hc2spOw0KKw0KKwkJCXMgPSBCaXRWZWN0b3Iz
Mi5DcmVhdGVTZWN0aW9uICgyKTsNCisJCQlBc3NlcnRFcXVhbHMgKCIjMiIs
IChzaG9ydCkgMywgcy5NYXNrKTsNCisNCisJCQlzID0gQml0VmVjdG9yMzIu
Q3JlYXRlU2VjdGlvbiAoMyk7DQorCQkJQXNzZXJ0RXF1YWxzICgiIzMiLCAo
c2hvcnQpIDMsIHMuTWFzayk7DQorDQorCQkJcyA9IEJpdFZlY3RvcjMyLkNy
ZWF0ZVNlY3Rpb24gKDUpOw0KKwkJCUFzc2VydEVxdWFscyAoIiM0IiwgKHNo
b3J0KSA3LCBzLk1hc2spOw0KKwkJCQ0KKwkJCXMgPSBCaXRWZWN0b3IzMi5D
cmVhdGVTZWN0aW9uICgyMCk7DQorCQkJQXNzZXJ0RXF1YWxzICgiIzQiLCAo
c2hvcnQpIDB4MWYsIHMuTWFzayk7DQorDQorCQkJcyA9IEJpdFZlY3RvcjMy
LkNyZWF0ZVNlY3Rpb24gKEludDE2Lk1heFZhbHVlKTsNCisJCQlBc3NlcnRF
cXVhbHMgKCIjNSIsIChzaG9ydCkgMHg3ZmZmLCBzLk1hc2spOw0KKw0KKwkJ
CXMgPSBCaXRWZWN0b3IzMi5DcmVhdGVTZWN0aW9uIChJbnQxNi5NYXhWYWx1
ZSAtIDEwMCk7DQorCQkJQXNzZXJ0RXF1YWxzICgiIzYiLCAoc2hvcnQpIDB4
N2ZmZiwgcy5NYXNrKTsNCisNCisJCQl0cnkgew0KKwkJCQlCaXRWZWN0b3Iz
Mi5TZWN0aW9uIHMyID0gQml0VmVjdG9yMzIuQ3JlYXRlU2VjdGlvbiAoMCk7
DQorCQkJCUZhaWwgKCIjNyIpOw0KKwkJCX0gY2F0Y2ggKEFyZ3VtZW50RXhj
ZXB0aW9uKSB7fQ0KKw0KKwkJCXRyeSB7DQorCQkJCUJpdFZlY3RvcjMyLlNl
Y3Rpb24gczIgPSBCaXRWZWN0b3IzMi5DcmVhdGVTZWN0aW9uICgtMSk7DQor
CQkJCUZhaWwgKCIjOCIpOw0KKwkJCX0gY2F0Y2ggKEFyZ3VtZW50RXhjZXB0
aW9uKSB7fQ0KKw0KKwkJCXRyeSB7DQorCQkJCUJpdFZlY3RvcjMyLlNlY3Rp
b24gczIgPSBCaXRWZWN0b3IzMi5DcmVhdGVTZWN0aW9uIChJbnQxNi5NaW5W
YWx1ZSk7DQorCQkJCUZhaWwgKCIjOSIpOw0KKwkJCX0gY2F0Y2ggKEFyZ3Vt
ZW50RXhjZXB0aW9uKSB7fQ0KKwkJCQ0KKwkJCXMgPSBCaXRWZWN0b3IzMi5D
cmVhdGVTZWN0aW9uICgyMCk7DQorCQkJQXNzZXJ0RXF1YWxzICgiIzEwYSIs
IChzaG9ydCkgMHgxZiwgcy5NYXNrKTsNCisJCQlBc3NlcnRFcXVhbHMgKCIj
MTBiIiwgKHNob3J0KSAweDAwLCBzLk9mZnNldCk7CQkJDQorCQkJcyA9IEJp
dFZlY3RvcjMyLkNyZWF0ZVNlY3Rpb24gKDEyMCwgcyk7DQorCQkJQXNzZXJ0
RXF1YWxzICgiIzEwYyIsIChzaG9ydCkgMHg3Ziwgcy5NYXNrKTsNCisJCQlB
c3NlcnRFcXVhbHMgKCIjMTBkIiwgKHNob3J0KSAweDA1LCBzLk9mZnNldCk7
CQkJCQkNCisJCQlzID0gQml0VmVjdG9yMzIuQ3JlYXRlU2VjdGlvbiAoMTAw
MCwgcyk7DQorCQkJQXNzZXJ0RXF1YWxzICgiIzEwZSIsIChzaG9ydCkgMHgz
ZmYsIHMuTWFzayk7DQorCQkJQXNzZXJ0RXF1YWxzICgiIzEwZiIsIChzaG9y
dCkgMHgwYywgcy5PZmZzZXQpOwkJCQ0KKwkJfQ0KKw0KKwkJcHVibGljIHZv
aWQgVGVzdFVzZVNlY3Rpb25zKCkgew0KKwkJCUJpdFZlY3RvcjMyLlNlY3Rp
b24gczBfMSA9ICBCaXRWZWN0b3IzMi5DcmVhdGVTZWN0aW9uKDMpOyAvLyAy
IGJpdHMNCisJCQlCaXRWZWN0b3IzMi5TZWN0aW9uIHMyXzE1ID0gQml0VmVj
dG9yMzIuQ3JlYXRlU2VjdGlvbigxNjM4MywgczBfMSk7IC8vIDE0IGJpdHMN
CisJCQlCaXRWZWN0b3IzMi5TZWN0aW9uIHMxNl8zMCA9IEJpdFZlY3RvcjMy
LkNyZWF0ZVNlY3Rpb24oMzI3NjcsIHMyXzE1KTsgLy8gMTUgYml0cw0KKwkJ
CUJpdFZlY3RvcjMyLlNlY3Rpb24gczMxXzMxID0gIEJpdFZlY3RvcjMyLkNy
ZWF0ZVNlY3Rpb24oMSwgczE2XzMwKTsgLy8gMSBiaXRzDQorDQorCQkJLy8g
UmVhZCBzZWN0aW9ucyBmcm9tIHRlc3QgdmFsdWUgIjAxMTEgMTExMSAxMTEx
IDAwMDAgMTExMSAxMTExIDAwMDAgMTExMSINCisJCQlCaXRWZWN0b3IzMiBi
ID0gbmV3IEJpdFZlY3RvcjMyKDB4N2ZmMGZmMGYpOyANCisNCisJCQlBc3Nl
cnRFcXVhbHMgKCIjMWEiLCAweDMsIGJbczBfMV0pOyAvLyAxMQ0KKwkJCUFz
c2VydEVxdWFscyAoIiMxYiIsIDB4M2ZjMywgYltzMl8xNV0pOyAvLyAxMSAx
MTExIDExMDAgMDAxMSA9IDB4M2ZjMw0KKwkJCUFzc2VydEVxdWFscyAoIiMx
YyIsIDB4N2ZmMCwgYltzMTZfMzBdKTsgLy8gMTExIDExMTEgMTExMSAwMDAw
ID0gMHg3ZmYwDQorCQkJQXNzZXJ0RXF1YWxzICgiIzFkIiwgMHgwLCBiW3Mz
MV8zMV0pOwkNCisNCisJCQkvLyBXcml0ZSBzZWN0aW9ucw0KKwkJCWIgPSBu
ZXcgQml0VmVjdG9yMzIoKTsNCisJCQliW3MwXzFdID0gMzsNCisJCQlBc3Nl
cnRFcXVhbHMgKCIjMmEiLCAweDMsIGIuRGF0YSk7DQorDQorCQkJYiA9IG5l
dyBCaXRWZWN0b3IzMigpOw0KKwkJCWJbczJfMTVdID0gMTYzODM7DQorCQkJ
QXNzZXJ0RXF1YWxzICgiIzJiIiwgMTYzODMgPDwgMiwgYi5EYXRhKTsNCisN
CisJCQliID0gbmV3IEJpdFZlY3RvcjMyKCk7DQorCQkJYltzMTZfMzBdID0g
MzI3Njc7DQorCQkJQXNzZXJ0RXF1YWxzICgiIzJjIiwgMzI3NjcgPDwgMTYs
IGIuRGF0YSk7DQorDQorCQkJYiA9IG5ldyBCaXRWZWN0b3IzMigpOw0KKwkJ
CWJbczMxXzMxXSA9IDE7DQorCQkJQXNzZXJ0RXF1YWxzICgiIzJkIiwgMSA8
PCAzMSwgYi5EYXRhKTsNCisNCisJCQlDb25zb2xlLldyaXRlTGluZSgiSEVM
TExPT08iKTsNCisJCX0NCisNCisJCXB1YmxpYyB2b2lkIFRlc3RCYWRTZWN0
aW9ucygpIHsNCisJCQkvLyBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDMyIGJp
dHMgb2Ygc2VjdGlvbnMuDQorCQkJQml0VmVjdG9yMzIuU2VjdGlvbiBzMF8x
NCA9IEJpdFZlY3RvcjMyLkNyZWF0ZVNlY3Rpb24oMzI3NjcpOw0KKwkJCUJp
dFZlY3RvcjMyLlNlY3Rpb24gczE1XzI5ID0gQml0VmVjdG9yMzIuQ3JlYXRl
U2VjdGlvbigzMjc2NywgczBfMTQpOw0KKwkJCXRyeSB7DQorCQkJCUJpdFZl
Y3RvcjMyLlNlY3Rpb24gczMwXzMyID0gQml0VmVjdG9yMzIuQ3JlYXRlU2Vj
dGlvbig3LCBzMTVfMjkpOw0KKwkJCQlGYWlsKCIjMSIpOwkJCQkgIA0KKwkJ
CX0gY2F0Y2ggKEFyZ3VtZW50RXhjZXB0aW9uKSB7IH0NCisJCX0NCisNCisJ
CXByaXZhdGUgdm9pZCBQcmludCAoQml0VmVjdG9yMzIuU2VjdGlvbiBzKQ0K
KwkJew0KKwkJCUNvbnNvbGUuV3JpdGVMaW5lIChzLlRvU3RyaW5nICgpICsg
IiA6ICIrIHMuTWFzayArICIgOiAiICsgcy5PZmZzZXQpOw0KKwkJfQ0KKwl9
CSANCiB9DQpJbmRleDogU3lzdGVtL1Rlc3QvU3lzdGVtLkNvbGxlY3Rpb25z
LlNwZWNpYWxpemVkL0NoYW5nZUxvZw0KPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQ0KUkNTIGZpbGU6IC9tb25vL21jcy9jbGFzcy9TeXN0ZW0vVGVzdC9TeXN0
ZW0uQ29sbGVjdGlvbnMuU3BlY2lhbGl6ZWQvQ2hhbmdlTG9nLHYNCnJldHJp
ZXZpbmcgcmV2aXNpb24gMS4yDQpkaWZmIC11IC1yMS4yIENoYW5nZUxvZw0K
LS0tIFN5c3RlbS9UZXN0L1N5c3RlbS5Db2xsZWN0aW9ucy5TcGVjaWFsaXpl
ZC9DaGFuZ2VMb2cJMTEgTWF5IDIwMDIgMTU6MzA6NDQgLTAwMDAJMS4yDQor
KysgU3lzdGVtL1Rlc3QvU3lzdGVtLkNvbGxlY3Rpb25zLlNwZWNpYWxpemVk
L0NoYW5nZUxvZwkyNCBKdW4gMjAwMiAxMTowNjo0NSAtMDAwMA0KQEAgLTEs
MyArMSw3IEBADQorMjAwMi0wNi0yNCAgQW5kcmV3IEJpcmtldHQgPGFkYkB0
YXJkaXMuZWQuYWMudWs+DQorDQorCSogQml0VmVjdG9yMzJUZXN0LmNzOiBO
ZXcgdGVzdHMgZm9yIHNlY3Rpb25zIGFuZCByZW1vdmVkIF5NJ3MuDQorDQog
MjAwMi0wNS0xMSAgTGF3cmVuY2UgUGl0IDxsb3pAY2FibGUuYTIwMDAubmw+
DQogDQogCSogQWRkZWQgTmFtZVZhbHVlQ29sbGVjdGlvblRlc3QuVGVzdEdl
dFZhbHVlcw0K
---559023410-851401618-1024917661=:19519--