Radeon acceleration with Xfbdev

Michel Dänzer michel@daenzer.net
Mon, 01 Dec 2003 04:03:51 +0100


--=-5yPRgVVL2nsJ/oktrCsY
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On Thu, 2003-11-27 at 00:40, Eric Anholt wrote:=20
> On Mon, 2003-11-24 at 16:17, Michel D=C3=A4nzer wrote:
> >=20
> > I see some corruption with it, is that to be expected Eric?
>=20
> Depends on the sort of corruption.  I haven't seen unexplained
> corruption at 16 bit for a while.  8-bit had issues, and I can't
> remember if 24 was completely fixed or not (I seem to recall issues with
> one of either r128 or radeon in some cases).

I run at 32 bpp most of the time; 8 is indeed worse, can't say much
about 16 because it seems to be broken in radeonfb in 2.6 kernels.

What I see is mostly pixmap corruption, in particular in GTK apps, but
the WindowMaker wallpaper is also corrupted with xcompmgr running (on
the bright side, xcompmgr works correctly now here, the endianness bugs
seem to have been fixed :).

These go away if I limit the amount of video RAM to be used to 8192
scanlines (don't ask me why... I only noticed looking closer at the code
that this shouldn't make a difference after I tried it :), but I can
still reliably cause corruption by maximizing the Text Widget window in
gtk-demo.


> It seems backwards to me to have the fbdev driver implement the
> acceleration itself, but I guess that was the quick'n'dirty part. =20

Not really, I think Xfbdev automagically picking the right acceleration
code would be nice, but adding fbdev support to Xati instead is fine
with me.


> I've been playing with having both vesa and fbdev support, with the defau=
lt
> being to use fbdev (since it should be more trustworthy in the end), and
> what I have so far is attached.  VESA continues to work, but fb is
> getting me a segfault and the following delightful output:
>=20
> (gdb) r
> Starting program: /usr/src/xserver/hw/kdrive/ati/Xati
> =20
> Program received signal SIGSEGV, Segmentation fault.
> 0x00000000 in ?? ()
> (gdb) bt
> #0  0x00000000 in ?? ()
> (gdb)

After a lot of stepping around in gdb, I tracked this down to
ATICreateResources(), the pointer was never initialised, it probably
doesn't get called with vesa for some reason?


Here's what I've got now.


--=20
Earthling Michel D=C3=A4nzer      |     Debian (powerpc), X and DRI develop=
er
Software libre enthusiast    |   http://svcs.affero.net/rm.php?r=3Ddaenzer

--=-5yPRgVVL2nsJ/oktrCsY
Content-Disposition: attachment; filename=xserver-ati-fbdev.diff
Content-Type: text/x-patch; name=xserver-ati-fbdev.diff; charset=UTF-8
Content-Transfer-Encoding: base64

SW5kZXg6IGNvbmZpZ3VyZS5hYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KUkNTIGZpbGU6IC9jdnMveHNlcnZlci94
c2VydmVyL2NvbmZpZ3VyZS5hYyx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDMuMzgNCmRpZmYgLXAg
LXUgLXIzLjM4IGNvbmZpZ3VyZS5hYw0KLS0tIGNvbmZpZ3VyZS5hYwkyMiBOb3YgMjAwMyAwMjox
OTo0NCAtMDAwMAkzLjM4DQorKysgY29uZmlndXJlLmFjCTEgRGVjIDIwMDMgMDI6NTM6MzUgLTAw
MDANCkBAIC02NCw2ICs2NCw5IEBAIEFDX0NIRUNLX0hFQURFUlMoW2xpbnV4L2FncGdhcnQuaCBz
eXMvYWcNCiAjIEFQTSBoZWFkZXINCiBBQ19DSEVDS19IRUFERVJTKFtsaW51eC9hcG1fYmlvcy5o
XSkNCiANCisjIGZiZGV2IGhlYWRlcg0KK0FDX0NIRUNLX0hFQURFUlMoW2xpbnV4L2ZiLmhdKQ0K
Kw0KICMgTVRSUiBoZWFkZXINCiBBQ19DSEVDS19IRUFERVJTKFthc20vbXRyci5oXSkNCiANCkBA
IC0yMjEsMTIgKzIyNCwxNyBAQCBBTV9DT05ESVRJT05BTChVU0VfUkdCX0JVSUxUSU4sIFt0ZXN0
IHgkDQogaWYgdGVzdCAiJFVTRV9SR0JfQlVJTFRJTiIgPSB5ZXM7IHRoZW4NCiAJQUNfREVGSU5F
KFVTRV9SR0JfQlVJTFRJTiwxLFtVc2UgYnVpbHRpbiByZ2IgY29sb3IgZGF0YWJhc2VdKQ0KIGZp
DQotCQ0KKw0KIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3ZtODZfaCIgPSB5ZXM7IHRoZW4N
Ci0JQUNfREVGSU5FKEtEUklWRVZFU0EsIDEsIFtJbmNsdWRlIHZlc2EtYmFzZWQgWCBzZXJ2ZXJz
XSkNCisJQUNfREVGSU5FKEtEUklWRVZFU0EsIDEsIFtJbmNsdWRlIHZlc2EtYmFzZWQgWCBzZXJ2
ZXJzIGFuZCB2ZXNhIHN1cHBvcnRdKQ0KIGZpDQogQU1fQ09ORElUSU9OQUwoS0RSSVZFVkVTQSwg
W3Rlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3ZtODZfaCIgPSB5ZXNdKQ0KIA0KK2lmIHRlc3QgIiRh
Y19jdl9oZWFkZXJfbGludXhfZmJfaCIgPSB5ZXM7IHRoZW4NCisJQUNfREVGSU5FKEtEUklWRUZC
REVWLCAxLCBbSW5jbHVkZSBmcmFtZWJ1ZmZlci1iYXNlZCBYIHNlcnZlcnMgYW5kIGZyYW1lYnVm
ZmVyIHN1cHBvcnRdKQ0KK2ZpDQorQU1fQ09ORElUSU9OQUwoS0RSSVZFRkJERVYsIFt0ZXN0ICIk
YWNfY3ZfaGVhZGVyX2xpbnV4X2ZiX2giID0geWVzXSkNCisNCiBBQ19ERUZJTkVfVU5RVU9URUQo
Q09NUElMRURERUZBVUxURk9OVFBBVEgsIFsiJEZPTlRQQVRIIl0sIFtEZWZhdWx0IGZvbnQgcGF0
aF0pDQogQUNfREVGSU5FX1VOUVVPVEVEKFZFTkRPUl9TVFJJTkcsWyIkVkVORE9SX1NUUklORyJd
LCBbVmVuZG9yIG5hbWVdKQ0KIEFDX0RFRklORV9VTlFVT1RFRChWRU5ET1JfUkVMRUFTRSwgWyRW
RU5ET1JfUkVMRUFTRV0sIFtWZW5kb3IgcmVsZWFzZV0pDQpJbmRleDogaHcva2RyaXZlL01ha2Vm
aWxlLmFtDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2N2cy94c2VydmVyL3hzZXJ2ZXIvaHcva2Ry
aXZlL01ha2VmaWxlLmFtLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS4xNQ0KZGlmZiAtcCAtdSAt
cjEuMTUgTWFrZWZpbGUuYW0NCi0tLSBody9rZHJpdmUvTWFrZWZpbGUuYW0JMTkgTm92IDIwMDMg
MDg6MzI6MzMgLTAwMDAJMS4xNQ0KKysrIGh3L2tkcml2ZS9NYWtlZmlsZS5hbQkxIERlYyAyMDAz
IDAyOjUzOjM1IC0wMDAwDQpAQCAtMSwxMCArMSwxNCBAQA0KIGlmIEtEUklWRVZFU0ENCi1WRVNB
X1NVQkRJUlMgPSB2ZXNhIGF0aSBtYWNoNjQgbWdhIG52aWRpYSByMTI4IHNtaQ0KK1ZFU0FfU1VC
RElSUyA9IHZlc2EgbWFjaDY0IG1nYSBudmlkaWEgcjEyOCBzbWkNCiBlbmRpZg0KIA0KLVNVQkRJ
UlMgPQlcDQotCXNyYwlcDQotCWxpbnV4CVwNCi0JZmJkZXYJXA0KLQkkKFZFU0FfU1VCRElSUykN
CitpZiBLRFJJVkVGQkRFVg0KK0ZCREVWX1NVQkRJUlMgPSBmYmRldg0KK2VuZGlmDQogDQorU1VC
RElSUyA9CQkJXA0KKwlzcmMJCQlcDQorCWxpbnV4CQkJXA0KKwkkKEZCREVWX1NVQkRJUlMpCVwN
CisJJChWRVNBX1NVQkRJUlMpCQlcDQorCWF0aQ0KSW5kZXg6IGh3L2tkcml2ZS9hdGkvTWFrZWZp
bGUuYW0NCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvY3ZzL3hzZXJ2ZXIveHNlcnZlci9ody9rZHJp
dmUvYXRpL01ha2VmaWxlLmFtLHYNCnJldHJpZXZpbmcgcmV2aXNpb24gMS4xDQpkaWZmIC1wIC11
IC1yMS4xIE1ha2VmaWxlLmFtDQotLS0gaHcva2RyaXZlL2F0aS9NYWtlZmlsZS5hbQkxOSBOb3Yg
MjAwMyAwODozMjozNSAtMDAwMAkxLjENCisrKyBody9rZHJpdmUvYXRpL01ha2VmaWxlLmFtCTEg
RGVjIDIwMDMgMDI6NTM6MzUgLTAwMDANCkBAIC0xLDYgKzEsMTggQEANCitpZiBLRFJJVkVGQkRF
Vg0KK0ZCREVWX0lOQ0xVREVTID0tSSQodG9wX3NyY2RpcikvaHcva2RyaXZlL2ZiZGV2DQorRkJE
RVZfTElCUyA9ICQodG9wX2J1aWxkZGlyKS9ody9rZHJpdmUvZmJkZXYvbGliZmJkZXYuYQ0KK2Vu
ZGlmDQorDQoraWYgS0RSSVZFVkVTQQ0KK1ZFU0FfSU5DTFVERVMgPSAtSSQodG9wX3NyY2Rpcikv
aHcva2RyaXZlL3Zlc2ENCitWRVNBX0xJQlMgPSAkKHRvcF9idWlsZGRpcikvaHcva2RyaXZlL3Zl
c2EvbGlidmVzYS5hDQorZW5kaWYNCisNCisNCiBJTkNMVURFUyA9IAkJCQkJXA0KIAlAS0RSSVZF
X0lOQ1NACQkJCVwNCi0JLUkkKHRvcF9zcmNkaXIpL2h3L2tkcml2ZS92ZXNhCQlcDQorCSQoRkJE
RVZfSU5DTFVERVMpCQkJXA0KKwkkKFZFU0FfSU5DTFVERVMpCQkJXA0KIAlAWFNFUlZFUl9DRkxB
R1NADQogDQogYmluX1BST0dSQU1TID0gWGF0aQ0KQEAgLTIyLDcgKzM0LDggQEAgWGF0aV9TT1VS
Q0VTID0gXA0KIA0KIFhhdGlfTERBREQgPSBcDQogCWxpYmF0aS5hIAkJCQlcDQotCSQodG9wX2J1
aWxkZGlyKS9ody9rZHJpdmUvdmVzYS9saWJ2ZXNhLmEgXA0KKwkkKEZCREVWX0xJQlMpCQkJCVwN
CisJJChWRVNBX0xJQlMpCQkJCVwNCiAJQEtEUklWRV9MSUJTQAkJCQlcDQogCUBYU0VSVkVSX0xJ
QlNAICAgICAgICAgICAgICAgICAgICAgICAgICBcDQogCSQoVFNMSUJfRkxBRykNCkluZGV4OiBo
dy9rZHJpdmUvYXRpL2F0aS5jDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTogL2N2cy94c2VydmVyL3hz
ZXJ2ZXIvaHcva2RyaXZlL2F0aS9hdGkuYyx2DQpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNQ0KZGlm
ZiAtcCAtdSAtcjEuNSBhdGkuYw0KLS0tIGh3L2tkcml2ZS9hdGkvYXRpLmMJMjUgTm92IDIwMDMg
MjI6Mzk6NTQgLTAwMDAJMS41DQorKysgaHcva2RyaXZlL2F0aS9hdGkuYwkxIERlYyAyMDAzIDAy
OjUzOjM1IC0wMDAwDQpAQCAtNTksNiArNTksNyBAQCBzdHJ1Y3QgcGNpX2lkX2xpc3QgcmFkZW9u
X2lkX2xpc3RbXSA9IHsNCiAJezB4MTAwMiwgMHg0YzU4LCAiQVRJIFJhZGVvbiBSVjIwMCBMWCJ9
LA0KIAl7MHgxMDAyLCAweDRjNTksICJBVEkgUmFkZW9uIE1vYmlsaXR5IE02IExZIn0sDQogCXsw
eDEwMDIsIDB4NGM1YSwgIkFUSSBSYWRlb24gTW9iaWxpdHkgTFoifSwNCisJezB4MTAwMiwgMHg0
YzY2LCAiQVRJIFJhZGVvbiBNb2JpbGl0eSBNOSBMZiJ9LA0KIAl7MHgxMDAyLCAweDRlNDQsICJB
VEkgUmFkZW9uIFIzMDAgTkQifSwNCiAJezB4MTAwMiwgMHg0ZTQ1LCAiQVRJIFJhZGVvbiBSMzAw
IE5FIn0sDQogCXsweDEwMDIsIDB4NGU0NiwgIkFUSSBSYWRlb24gUjMwMCBORiJ9LA0KQEAgLTE1
MywxNSArMTU0LDQ4IEBAIEFUSUNhcmRJbml0KEtkQ2FyZEluZm8gKmNhcmQpDQogew0KIAlBVElD
YXJkSW5mbyAqYXRpYzsNCiAJaW50IGk7DQorCUJvb2wgaW5pdGlhbGl6ZWQgPSBGQUxTRTsNCiAN
Ci0JYXRpYyA9IHhhbGxvYyhzaXplb2YoQVRJQ2FyZEluZm8pKTsNCisJYXRpYyA9IHhjYWxsb2Mo
c2l6ZW9mKEFUSUNhcmRJbmZvKSwgMSk7DQogCWlmIChhdGljID09IE5VTEwpDQogCQlyZXR1cm4g
RkFMU0U7DQogDQotCUFUSU1hcFJlZyhjYXJkLCBhdGljKTsNCisjaWZkZWYgS0RSSVZFRkJERVYN
CisJaWYgKCFpbml0aWFsaXplZCAmJiBmYmRldkluaXRpYWxpemUoY2FyZCwgJmF0aWMtPmJhY2tl
bmRfcHJpdi5mYmRldikpIHsNCisJCWF0aWMtPnVzZV9mYmRldiA9IFRSVUU7DQorCQlpbml0aWFs
aXplZCA9IFRSVUU7DQorCQlhdGljLT5iYWNrZW5kX2Z1bmNzLmNhcmRmaW5pID0gZmJkZXZDYXJk
RmluaTsNCisJCWF0aWMtPmJhY2tlbmRfZnVuY3Muc2NyZmluaSA9IGZiZGV2U2NyZWVuRmluaTsN
CisJCWF0aWMtPmJhY2tlbmRfZnVuY3MuaW5pdFNjcmVlbiA9IGZiZGV2SW5pdFNjcmVlbjsNCisJ
CWF0aWMtPmJhY2tlbmRfZnVuY3MuZmluaXNoSW5pdFNjcmVlbiA9IGZiZGV2RmluaXNoSW5pdFNj
cmVlbjsNCisJCWF0aWMtPmJhY2tlbmRfZnVuY3MucHJlc2VydmUgPSBmYmRldlByZXNlcnZlOw0K
KwkJYXRpYy0+YmFja2VuZF9mdW5jcy5yZXN0b3JlID0gZmJkZXZSZXN0b3JlOw0KKwkJYXRpYy0+
YmFja2VuZF9mdW5jcy5kcG1zID0gZmJkZXZEUE1TOw0KKwkJYXRpYy0+YmFja2VuZF9mdW5jcy5l
bmFibGUgPSBmYmRldkVuYWJsZTsNCisJCWF0aWMtPmJhY2tlbmRfZnVuY3MuZGlzYWJsZSA9IGZi
ZGV2RGlzYWJsZTsNCisJCWF0aWMtPmJhY2tlbmRfZnVuY3MuZ2V0Q29sb3JzID0gZmJkZXZHZXRD
b2xvcnM7DQorCQlhdGljLT5iYWNrZW5kX2Z1bmNzLnB1dENvbG9ycyA9IGZiZGV2UHV0Q29sb3Jz
Ow0KKwl9DQorI2VuZGlmDQorI2lmZGVmIEtEUklWRVZFU0ENCisJaWYgKCFpbml0aWFsaXplZCAm
JiB2ZXNhSW5pdGlhbGl6ZShjYXJkLCAmYXRpYy0+YmFja2VuZF9wcml2LnZlc2EpKSB7DQorCQlh
dGljLT51c2VfdmVzYSA9IFRSVUU7DQorCQlpbml0aWFsaXplZCA9IFRSVUU7DQorCQlhdGljLT5i
YWNrZW5kX2Z1bmNzLmNhcmRmaW5pID0gdmVzYUNhcmRGaW5pOw0KKwkJYXRpYy0+YmFja2VuZF9m
dW5jcy5zY3JmaW5pID0gdmVzYVNjcmVlbkZpbmk7DQorCQlhdGljLT5iYWNrZW5kX2Z1bmNzLmlu
aXRTY3JlZW4gPSB2ZXNhSW5pdFNjcmVlbjsNCisJCWF0aWMtPmJhY2tlbmRfZnVuY3MuZmluaXNo
SW5pdFNjcmVlbiA9IHZlc2FGaW5pc2hJbml0U2NyZWVuOw0KKwkJYXRpYy0+YmFja2VuZF9mdW5j
cy5wcmVzZXJ2ZSA9IHZlc2FQcmVzZXJ2ZTsNCisJCWF0aWMtPmJhY2tlbmRfZnVuY3MucmVzdG9y
ZSA9IHZlc2FSZXN0b3JlOw0KKwkJYXRpYy0+YmFja2VuZF9mdW5jcy5kcG1zID0gdmVzYURQTVM7
DQorCQlhdGljLT5iYWNrZW5kX2Z1bmNzLmVuYWJsZSA9IHZlc2FFbmFibGU7DQorCQlhdGljLT5i
YWNrZW5kX2Z1bmNzLmRpc2FibGUgPSB2ZXNhRGlzYWJsZTsNCisJCWF0aWMtPmJhY2tlbmRfZnVu
Y3MuZ2V0Q29sb3JzID0gdmVzYUdldENvbG9yczsNCisJCWF0aWMtPmJhY2tlbmRfZnVuY3MucHV0
Q29sb3JzID0gdmVzYVB1dENvbG9yczsNCisJfQ0KKyNlbmRpZg0KIA0KLQlpZiAoIXZlc2FJbml0
aWFsaXplKGNhcmQsICZhdGljLT52ZXNhKSkNCi0Jew0KKwlpZiAoIWluaXRpYWxpemVkIHx8ICFB
VElNYXBSZWcoY2FyZCwgYXRpYykpIHsNCiAJCXhmcmVlKGF0aWMpOw0KIAkJcmV0dXJuIEZBTFNF
Ow0KIAl9DQpAQCAtMTgxLDM5ICsyMTUsNDUgQEAgQVRJQ2FyZEZpbmkoS2RDYXJkSW5mbyAqY2Fy
ZCkNCiAJQVRJQ2FyZEluZm8gKmF0aWMgPSAoQVRJQ2FyZEluZm8gKiljYXJkLT5kcml2ZXI7DQog
DQogCUFUSVVubWFwUmVnKGNhcmQsIGF0aWMpOw0KLQl2ZXNhQ2FyZEZpbmkoY2FyZCk7DQorCWF0
aWMtPmJhY2tlbmRfZnVuY3MuY2FyZGZpbmkoY2FyZCk7DQogfQ0KIA0KIHN0YXRpYyBCb29sDQog
QVRJU2NyZWVuSW5pdChLZFNjcmVlbkluZm8gKnNjcmVlbikNCiB7DQogCUFUSVNjcmVlbkluZm8g
KmF0aXM7DQotCWludCBzY3JlZW5fc2l6ZSwgbWVtb3J5Ow0KKwlBVElDYXJkSW5mbyAqYXRpYyA9
IHNjcmVlbi0+Y2FyZC0+ZHJpdmVyOw0KKwlpbnQgc3VjY2VzcyA9IEZBTFNFOw0KIA0KLQlhdGlz
ID0geGFsbG9jKHNpemVvZihBVElTY3JlZW5JbmZvKSk7DQorCWF0aXMgPSB4Y2FsbG9jKHNpemVv
ZihBVElTY3JlZW5JbmZvKSwgMSk7DQogCWlmIChhdGlzID09IE5VTEwpDQogCQlyZXR1cm4gRkFM
U0U7DQotCW1lbXNldChhdGlzLCAnXDAnLCBzaXplb2YoQVRJU2NyZWVuSW5mbykpOw0KIA0KLQlp
ZiAoIXZlc2FTY3JlZW5Jbml0aWFsaXplKHNjcmVlbiwgJmF0aXMtPnZlc2EpKQ0KLQl7DQorCWlm
IChzY3JlZW4tPmZiWzBdLmRlcHRoID09IDApDQorCQlzY3JlZW4tPmZiWzBdLmRlcHRoID0gMTY7
DQorDQorCXNjcmVlbi0+ZHJpdmVyID0gYXRpczsNCisNCisjaWZkZWYgS0RSSVZFRkJERVYNCisJ
aWYgKGF0aWMtPnVzZV9mYmRldikgew0KKwkJc3VjY2VzcyA9IGZiZGV2U2NyZWVuSW5pdGlhbGl6
ZShzY3JlZW4sDQorCQkJCQkJJmF0aXMtPmJhY2tlbmRfcHJpdi5mYmRldik7DQorCQlzY3JlZW4t
Pm1lbW9yeV9zaXplID0gbWluKGF0aWMtPmJhY2tlbmRfcHJpdi5mYmRldi5maXguc21lbV9sZW4s
IDgxOTIgKiBzY3JlZW4tPmZiWzBdLmJ5dGVTdHJpZGUpOw0KKwkJLypzY3JlZW4tPm1lbW9yeV9z
aXplID0gYXRpYy0+YmFja2VuZF9wcml2LmZiZGV2LmZpeC5zbWVtX2xlbjsqLw0KKwkJc2NyZWVu
LT5vZmZfc2NyZWVuX2Jhc2UgPSBhdGljLT5iYWNrZW5kX3ByaXYuZmJkZXYudmFyLnlyZXNfdmly
dHVhbCAqIHNjcmVlbi0+ZmJbMF0uYnl0ZVN0cmlkZTsNCisJfQ0KKyNlbmRpZg0KKyNpZmRlZiBL
RFJJVkVWRVNBDQorCWlmIChhdGljLT51c2VfdmVzYSkNCisJCXN1Y2Nlc3MgPSB2ZXNhU2NyZWVu
SW5pdGlhbGl6ZShzY3JlZW4sDQorCQkgICAgJmF0aXMtPmJhY2tlbmRfcHJpdi52ZXNhKTsNCisj
ZW5kaWYNCisJaWYgKCFzdWNjZXNzKSB7DQorCQlzY3JlZW4tPmRyaXZlciA9IE5VTEw7DQogCQl4
ZnJlZShhdGlzKTsNCiAJCXJldHVybiBGQUxTRTsNCiAJfQ0KLQlhdGlzLT5zY3JlZW4gPSBhdGlz
LT52ZXNhLmZiOw0KLQ0KLQltZW1vcnkgPSBhdGlzLT52ZXNhLmZiX3NpemU7DQotCXNjcmVlbl9z
aXplID0gc2NyZWVuLT5mYlswXS5ieXRlU3RyaWRlICogc2NyZWVuLT5oZWlnaHQ7DQogDQotCW1l
bW9yeSAtPSBzY3JlZW5fc2l6ZTsNCi0JaWYgKG1lbW9yeSA+IHNjcmVlbi0+ZmJbMF0uYnl0ZVN0
cmlkZSkgew0KLQkJYXRpcy0+b2ZmX3NjcmVlbiA9IGF0aXMtPnNjcmVlbiArIHNjcmVlbl9zaXpl
Ow0KLQkJYXRpcy0+b2ZmX3NjcmVlbl9zaXplID0gbWVtb3J5Ow0KLQl9IGVsc2Ugew0KLQkJYXRp
cy0+b2ZmX3NjcmVlbiA9IDA7DQotCQlhdGlzLT5vZmZfc2NyZWVuX3NpemUgPSAwOw0KLQl9DQot
CXNjcmVlbi0+ZHJpdmVyID0gYXRpczsNCiAJcmV0dXJuIFRSVUU7DQogfQ0KIA0KQEAgLTIyMSw4
ICsyNjEsOSBAQCBzdGF0aWMgdm9pZA0KIEFUSVNjcmVlbkZpbmkoS2RTY3JlZW5JbmZvICpzY3Jl
ZW4pDQogew0KIAlBVElTY3JlZW5JbmZvICphdGlzID0gKEFUSVNjcmVlbkluZm8gKilzY3JlZW4t
PmRyaXZlcjsNCisJQVRJQ2FyZEluZm8gKmF0aWMgPSBzY3JlZW4tPmNhcmQtPmRyaXZlcjsNCiAN
Ci0JdmVzYVNjcmVlbkZpbmkoc2NyZWVuKTsNCisJYXRpYy0+YmFja2VuZF9mdW5jcy5zY3JmaW5p
KHNjcmVlbik7DQogCXhmcmVlKGF0aXMpOw0KIAlzY3JlZW4tPmRyaXZlciA9IDA7DQogfQ0KQEAg
LTI2NiwxMiArMzA3LDQ5IEBAIEFUSVJlc2V0TU1JTyhLZENhcmRJbmZvICpjYXJkLCBBVElDYXJk
SW4NCiAJQVRJVW5tYXBSZWcoY2FyZCwgYXRpYyk7DQogfQ0KIA0KK3N0YXRpYyBCb29sDQorQVRJ
SW5pdFNjcmVlbihTY3JlZW5QdHIgcFNjcmVlbikNCit7DQorCUtkU2NyZWVuUHJpdihwU2NyZWVu
KTsNCisJQVRJQ2FyZEluZm8ocFNjcmVlblByaXYpOw0KKw0KKwlyZXR1cm4gYXRpYy0+YmFja2Vu
ZF9mdW5jcy5pbml0U2NyZWVuKHBTY3JlZW4pOw0KK30NCisNCitzdGF0aWMgQm9vbA0KK0FUSUZp
bmlzaEluaXRTY3JlZW4oU2NyZWVuUHRyIHBTY3JlZW4pDQorew0KKwlLZFNjcmVlblByaXYocFNj
cmVlbik7DQorCUFUSUNhcmRJbmZvKHBTY3JlZW5Qcml2KTsNCisNCisJcmV0dXJuIGF0aWMtPmJh
Y2tlbmRfZnVuY3MuZmluaXNoSW5pdFNjcmVlbihwU2NyZWVuKTsNCit9DQorDQorc3RhdGljIHZv
aWQNCitBVElQcmVzZXJ2ZShLZENhcmRJbmZvICpjYXJkKQ0KK3sNCisJQVRJQ2FyZEluZm8gKmF0
aWMgPSBjYXJkLT5kcml2ZXI7DQorDQorCWF0aWMtPmJhY2tlbmRfZnVuY3MucHJlc2VydmUoY2Fy
ZCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkDQorQVRJUmVzdG9yZShLZENhcmRJbmZvICpjYXJkKQ0K
K3sNCisJQVRJQ2FyZEluZm8gKmF0aWMgPSBjYXJkLT5kcml2ZXI7DQorDQorCUFUSVJlc2V0TU1J
TyhjYXJkLCBhdGljKTsNCisNCisJYXRpYy0+YmFja2VuZF9mdW5jcy5yZXN0b3JlKGNhcmQpOw0K
K30NCiANCiBzdGF0aWMgQm9vbA0KIEFUSURQTVMoU2NyZWVuUHRyIHBTY3JlZW4sIGludCBtb2Rl
KQ0KIHsNCi0JLyogWFhYICovDQotCXJldHVybiBUUlVFOw0KKwlLZFNjcmVlblByaXYocFNjcmVl
bik7DQorCUFUSUNhcmRJbmZvKHBTY3JlZW5Qcml2KTsNCisNCisJcmV0dXJuIGF0aWMtPmJhY2tl
bmRfZnVuY3MuZHBtcyhwU2NyZWVuLCBtb2RlKTsNCiB9DQogDQogc3RhdGljIEJvb2wNCkBAIC0y
ODAsNyArMzU4LDcgQEAgQVRJRW5hYmxlKFNjcmVlblB0ciBwU2NyZWVuKQ0KIAlLZFNjcmVlblBy
aXYocFNjcmVlbik7DQogCUFUSUNhcmRJbmZvKHBTY3JlZW5Qcml2KTsNCiANCi0JaWYgKCF2ZXNh
RW5hYmxlKHBTY3JlZW4pKQ0KKwlpZiAoIWF0aWMtPmJhY2tlbmRfZnVuY3MuZW5hYmxlKHBTY3Jl
ZW4pKQ0KIAkJcmV0dXJuIEZBTFNFOw0KIA0KIAlBVElTZXRNTUlPKHBTY3JlZW5Qcml2LT5jYXJk
LCBhdGljKTsNCkBAIC0yOTYsMjUgKzM3NCwzNiBAQCBBVElEaXNhYmxlKFNjcmVlblB0ciBwU2Ny
ZWVuKQ0KIAlBVElDYXJkSW5mbyhwU2NyZWVuUHJpdik7DQogDQogCUFUSVJlc2V0TU1JTyhwU2Ny
ZWVuUHJpdi0+Y2FyZCwgYXRpYyk7DQotCXZlc2FEaXNhYmxlKHBTY3JlZW4pOw0KKw0KKwlhdGlj
LT5iYWNrZW5kX2Z1bmNzLmRpc2FibGUocFNjcmVlbik7DQogfQ0KIA0KIHN0YXRpYyB2b2lkDQot
QVRJUmVzdG9yZShLZENhcmRJbmZvICpjYXJkKQ0KK0FUSUdldENvbG9ycyhTY3JlZW5QdHIgcFNj
cmVlbiwgaW50IGZiLCBpbnQgbiwgeENvbG9ySXRlbSAqcGRlZnMpDQogew0KLQlBVElDYXJkSW5m
byAqYXRpYyA9IGNhcmQtPmRyaXZlcjsNCisJS2RTY3JlZW5Qcml2KHBTY3JlZW4pOw0KKwlBVElD
YXJkSW5mbyhwU2NyZWVuUHJpdik7DQogDQotCUFUSVJlc2V0TU1JTyhjYXJkLCBhdGljKTsNCi0J
dmVzYVJlc3RvcmUoY2FyZCk7DQorCWF0aWMtPmJhY2tlbmRfZnVuY3MuZ2V0Q29sb3JzKHBTY3Jl
ZW4sIGZiLCBuLCBwZGVmcyk7DQorfQ0KKw0KKw0KK3N0YXRpYyB2b2lkDQorQVRJUHV0Q29sb3Jz
KFNjcmVlblB0ciBwU2NyZWVuLCBpbnQgZmIsIGludCBuLCB4Q29sb3JJdGVtICpwZGVmcykNCit7
DQorCUtkU2NyZWVuUHJpdihwU2NyZWVuKTsNCisJQVRJQ2FyZEluZm8ocFNjcmVlblByaXYpOw0K
Kw0KKwlhdGljLT5iYWNrZW5kX2Z1bmNzLnB1dENvbG9ycyhwU2NyZWVuLCBmYiwgbiwgcGRlZnMp
Ow0KIH0NCiANCiBLZENhcmRGdW5jcyBBVElGdW5jcyA9IHsNCiAJQVRJQ2FyZEluaXQsCQkvKiBj
YXJkaW5pdCAqLw0KIAlBVElTY3JlZW5Jbml0LAkJLyogc2NyaW5pdCAqLw0KLQl2ZXNhSW5pdFNj
cmVlbiwJCS8qIGluaXRTY3JlZW4gKi8NCi0JdmVzYUZpbmlzaEluaXRTY3JlZW4sCS8qIGZpbmlz
aEluaXRTY3JlZW4gKi8NCi0JdmVzYUNyZWF0ZVJlc291cmNlcywJLyogY3JlYXRlUmVzICovDQot
CXZlc2FQcmVzZXJ2ZSwJCS8qIHByZXNlcnZlICovDQorCUFUSUluaXRTY3JlZW4sCQkvKiBpbml0
U2NyZWVuICovDQorCUFUSUZpbmlzaEluaXRTY3JlZW4sCS8qIGZpbmlzaEluaXRTY3JlZW4gKi8N
CisJMCwJCQkvKiBjcmVhdGVSZXMgKi8NCisJQVRJUHJlc2VydmUsCQkvKiBwcmVzZXJ2ZSAqLw0K
IAlBVElFbmFibGUsCQkvKiBlbmFibGUgKi8NCiAJQVRJRFBNUywJCS8qIGRwbXMgKi8NCiAJQVRJ
RGlzYWJsZSwJCS8qIGRpc2FibGUgKi8NCkBAIC0zMzQsNyArNDIzLDcgQEAgS2RDYXJkRnVuY3Mg
QVRJRnVuY3MgPSB7DQogCUFUSURyYXdEaXNhYmxlLAkJLyogZGlzYWJsZUFjY2VsICovDQogCUFU
SURyYXdGaW5pLAkJLyogZmluaUFjY2VsICovDQogDQotCXZlc2FHZXRDb2xvcnMsCQkvKiBnZXRD
b2xvcnMgKi8NCi0JdmVzYVB1dENvbG9ycywJCS8qIHB1dENvbG9ycyAqLw0KKwlBVElHZXRDb2xv
cnMsCQkvKiBnZXRDb2xvcnMgKi8NCisJQVRJUHV0Q29sb3JzLAkJLyogcHV0Q29sb3JzICovDQog
fTsNCiANCkluZGV4OiBody9rZHJpdmUvYXRpL2F0aS5oDQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpSQ1MgZmlsZTog
L2N2cy94c2VydmVyL3hzZXJ2ZXIvaHcva2RyaXZlL2F0aS9hdGkuaCx2DQpyZXRyaWV2aW5nIHJl
dmlzaW9uIDEuMg0KZGlmZiAtcCAtdSAtcjEuMiBhdGkuaA0KLS0tIGh3L2tkcml2ZS9hdGkvYXRp
LmgJMjAgTm92IDIwMDMgMDc6NDk6NDUgLTAwMDAJMS4yDQorKysgaHcva2RyaXZlL2F0aS9hdGku
aAkxIERlYyAyMDAzIDAyOjUzOjM1IC0wMDAwDQpAQCAtMjUsMTQgKzI1LDUyIEBADQogDQogI2lm
bmRlZiBfQVRJX0hfDQogI2RlZmluZSBfQVRJX0hfDQorDQorI2luY2x1ZGUgImNvbmZpZy5oIg0K
Kw0KKyNpZmRlZiBLRFJJVkVGQkRFVg0KKyNpbmNsdWRlIDxmYmRldi5oPg0KKyNlbmRpZg0KKyNp
ZmRlZiBLRFJJVkVWRVNBDQogI2luY2x1ZGUgPHZlc2EuaD4NCisjZW5kaWYNCiANCiAjZGVmaW5l
IFJBREVPTl9SRUdfQkFTRShjKQkJKChjKS0+YXR0ci5hZGRyZXNzWzFdKQ0KICNkZWZpbmUgUkFE
RU9OX1JFR19TSVpFKGMpCQkoMHgxMDAwMCkNCiANCisjaWZkZWYgX19wb3dlcnBjX18NCisNCitz
dGF0aWMgX19pbmxpbmVfXyB2b2lkDQorTU1JT19PVVQzMihfX3ZvbGF0aWxlX18gdm9pZCAqYmFz
ZSwgY29uc3QgdW5zaWduZWQgbG9uZyBvZmZzZXQsDQorCSAgIGNvbnN0IHVuc2lnbmVkIGludCB2
YWwpDQorew0KKyAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oDQorICAgICAgICAgICAgICAg
ICAgICAgICAgInN0d2JyeCAlMSwlMiwlM1xuXHQiDQorCQkJImVpZWlvIg0KKyAgICAgICAgICAg
ICAgICAgICAgICAgIDogIj1tIiAoKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKWJhc2Urb2Zm
c2V0KSkNCisgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAodmFsKSwgImIiIChiYXNlKSwg
InIiIChvZmZzZXQpKTsNCit9DQorDQorc3RhdGljIF9faW5saW5lX18gQ0FSRDMyDQorTU1JT19J
TjMyKF9fdm9sYXRpbGVfXyB2b2lkICpiYXNlLCBjb25zdCB1bnNpZ25lZCBsb25nIG9mZnNldCkN
Cit7DQorICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgdmFsOw0KKyAgICAgICAgX19hc21f
XyBfX3ZvbGF0aWxlX18oDQorICAgICAgICAgICAgICAgICAgICAgICAgImx3YnJ4ICUwLCUxLCUy
XG5cdCINCisgICAgICAgICAgICAgICAgICAgICAgICAiZWllaW8iDQorICAgICAgICAgICAgICAg
ICAgICAgICAgOiAiPXIiICh2YWwpDQorICAgICAgICAgICAgICAgICAgICAgICAgOiAiYiIgKGJh
c2UpLCAiciIgKG9mZnNldCksDQorICAgICAgICAgICAgICAgICAgICAgICAgIm0iICgqKCh2b2xh
dGlsZSB1bnNpZ25lZCBjaGFyICopYmFzZStvZmZzZXQpKSk7DQorICAgICAgICByZXR1cm4gdmFs
Ow0KK30NCisNCisjZWxzZQ0KKw0KICNkZWZpbmUgTU1JT19PVVQzMihtbWlvLCBhLCB2KQkJKCoo
Vk9MMzIgKikoKG1taW8pICsgKGEpKSA9ICh2KSkNCiAjZGVmaW5lIE1NSU9fSU4zMihtbWlvLCBh
KQkJKCooVk9MMzIgKikoKG1taW8pICsgKGEpKSkNCiANCisjZW5kaWYNCisNCiB0eXBlZGVmIHZv
bGF0aWxlIENBUkQ4CVZPTDg7DQogdHlwZWRlZiB2b2xhdGlsZSBDQVJEMTYJVk9MMTY7DQogdHlw
ZWRlZiB2b2xhdGlsZSBDQVJEMzIJVk9MMzI7DQpAQCAtNDMsMjAgKzgxLDQ4IEBAIHN0cnVjdCBw
Y2lfaWRfbGlzdCB7DQogCWNoYXIgKm5hbWU7DQogfTsNCiANCitzdHJ1Y3QgYmFja2VuZF9mdW5j
cyB7DQorICAgICAgIHZvaWQgICAgKCpjYXJkZmluaSkoS2RDYXJkSW5mbyAqKTsNCisgICAgICAg
dm9pZCAgICAoKnNjcmZpbmkpKEtkU2NyZWVuSW5mbyAqKTsNCisgICAgICAgQm9vbCAgICAoKmlu
aXRTY3JlZW4pKFNjcmVlblB0cik7DQorICAgICAgIEJvb2wgICAgKCpmaW5pc2hJbml0U2NyZWVu
KShTY3JlZW5QdHIgcFNjcmVlbik7DQorICAgICAgIHZvaWQgICAgKCpwcmVzZXJ2ZSkoS2RDYXJk
SW5mbyAqKTsNCisgICAgICAgdm9pZCAgICAoKnJlc3RvcmUpKEtkQ2FyZEluZm8gKik7DQorICAg
ICAgIEJvb2wgICAgKCpkcG1zKShTY3JlZW5QdHIsIGludCk7DQorICAgICAgIEJvb2wgICAgKCpl
bmFibGUpKFNjcmVlblB0cik7DQorICAgICAgIHZvaWQgICAgKCpkaXNhYmxlKShTY3JlZW5QdHIp
Ow0KKyAgICAgICB2b2lkICAgICgqZ2V0Q29sb3JzKShTY3JlZW5QdHIsIGludCwgaW50LCB4Q29s
b3JJdGVtICopOw0KKyAgICAgICB2b2lkICAgICgqcHV0Q29sb3JzKShTY3JlZW5QdHIsIGludCwg
aW50LCB4Q29sb3JJdGVtICopOw0KK307DQorDQogdHlwZWRlZiBzdHJ1Y3QgX0FUSUNhcmRJbmZv
IHsNCi0JVmVzYUNhcmRQcml2UmVjIHZlc2E7DQorCXVuaW9uIHsNCisjaWZkZWYgS0RSSVZFRkJE
RVYNCisJCUZiZGV2UHJpdiBmYmRldjsNCisjZW5kaWYNCisjaWZkZWYgS0RSSVZFVkVTQQ0KKwkJ
VmVzYUNhcmRQcml2UmVjIHZlc2E7DQorI2VuZGlmDQorCX0gYmFja2VuZF9wcml2Ow0KKwlzdHJ1
Y3QgYmFja2VuZF9mdW5jcyBiYWNrZW5kX2Z1bmNzOw0KKw0KIAlDQVJEOCAqcmVnX2Jhc2U7DQog
CUJvb2wgaXNfcmFkZW9uOw0KKwlCb29sIHVzZV9mYmRldiwgdXNlX3Zlc2E7DQogfSBBVElDYXJk
SW5mbzsNCiANCiAjZGVmaW5lIGdldEFUSUNhcmRJbmZvKGtkKQkoKEFUSUNhcmRJbmZvICopICgo
a2QpLT5jYXJkLT5kcml2ZXIpKQ0KICNkZWZpbmUgQVRJQ2FyZEluZm8oa2QpCQlBVElDYXJkSW5m
byAqYXRpYyA9IGdldEFUSUNhcmRJbmZvKGtkKQ0KIA0KIHR5cGVkZWYgc3RydWN0IF9BVElTY3Jl
ZW5JbmZvIHsNCi0JVmVzYVNjcmVlblByaXZSZWMgdmVzYTsNCi0JQ0FSRDggKnNjcmVlbjsNCi0J
Q0FSRDggKm9mZl9zY3JlZW47DQotCWludCBvZmZfc2NyZWVuX3NpemU7DQorCXVuaW9uIHsNCisj
aWZkZWYgS0RSSVZFRkJERVYNCisJCUZiZGV2U2NyUHJpdiBmYmRldjsNCisjZW5kaWYNCisjaWZk
ZWYgS0RSSVZFVkVTQQ0KKwkJVmVzYVNjcmVlblByaXZSZWMgdmVzYTsNCisjZW5kaWYNCisJfSBi
YWNrZW5kX3ByaXY7DQogDQogCWludCBkYXRhdHlwZTsNCiAJaW50IGRwX2d1aV9tYXN0ZXJfY250
bDsNCkluZGV4OiBody9rZHJpdmUvYXRpL2F0aV9zdHViLmMNCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxl
OiAvY3ZzL3hzZXJ2ZXIveHNlcnZlci9ody9rZHJpdmUvYXRpL2F0aV9zdHViLmMsdg0KcmV0cmll
dmluZyByZXZpc2lvbiAxLjENCmRpZmYgLXAgLXUgLXIxLjEgYXRpX3N0dWIuYw0KLS0tIGh3L2tk
cml2ZS9hdGkvYXRpX3N0dWIuYwkxOSBOb3YgMjAwMyAwODozMjozNSAtMDAwMAkxLjENCisrKyBo
dy9rZHJpdmUvYXRpL2F0aV9zdHViLmMJMSBEZWMgMjAwMyAwMjo1MzozNSAtMDAwMA0KQEAgLTcz
LDcgKzczLDkgQEAgdm9pZA0KIGRkeFVzZU1zZyAodm9pZCkNCiB7DQogCUtkVXNlTXNnKCk7DQor
I2lmZGVmIEtEUklWRVZFU0ENCiAJdmVzYVVzZU1zZygpOw0KKyNlbmRpZg0KIH0NCiANCiBpbnQN
CkBAIC04MSw3ICs4MywxMCBAQCBkZHhQcm9jZXNzQXJndW1lbnQoaW50IGFyZ2MsIGNoYXIgKiph
cmd2DQogew0KIAlpbnQJcmV0Ow0KICAgICANCisjaWZkZWYgS0RSSVZFVkVTQQ0KIAlpZiAoIShy
ZXQgPSB2ZXNhUHJvY2Vzc0FyZ3VtZW50IChhcmdjLCBhcmd2LCBpKSkpDQorI2VuZGlmDQogCQly
ZXQgPSBLZFByb2Nlc3NBcmd1bWVudChhcmdjLCBhcmd2LCBpKTsNCisNCiAJcmV0dXJuIHJldDsN
CiB9DQpJbmRleDogaHcva2RyaXZlL2ZiZGV2L2ZiZGV2LmMNCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxl
OiAvY3ZzL3hzZXJ2ZXIveHNlcnZlci9ody9rZHJpdmUvZmJkZXYvZmJkZXYuYyx2DQpyZXRyaWV2
aW5nIHJldmlzaW9uIDEuNDANCmRpZmYgLXAgLXUgLXIxLjQwIGZiZGV2LmMNCi0tLSBody9rZHJp
dmUvZmJkZXYvZmJkZXYuYwkxNyBOb3YgMjAwMyAwNjo1NDo1MiAtMDAwMAkxLjQwDQorKysgaHcv
a2RyaXZlL2ZiZGV2L2ZiZGV2LmMJMSBEZWMgMjAwMyAwMjo1MzozNSAtMDAwMA0KQEAgLTM3LDcg
KzM3LDcgQEAgZmJkZXZJbml0aWFsaXplIChLZENhcmRJbmZvICpjYXJkLCBGYmRldg0KICAgICBp
bnQJCSAgICBrOw0KICAgICB1bnNpZ25lZCBsb25nICAgb2ZmOw0KICAgICBpZiAoKHByaXYtPmZk
ID0gb3BlbigiL2Rldi9mYjAiLCBPX1JEV1IpKSA8IDApIHsNCi0JcGVycm9yKCJFcnJvciBvcGVu
aW5nIC9kZXYvZmIwXG4iKTsNCisJcGVycm9yKCJFcnJvciBvcGVuaW5nIC9kZXYvZmIwIik7DQog
CXJldHVybiBGQUxTRTsNCiAgICAgfQ0KICAgICAvKiBxdWlldCB2YWxncmluZCAqLw0KSW5kZXg6
IGh3L2tkcml2ZS9zcmMva2RyaXZlLmgNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NClJDUyBmaWxlOiAvY3ZzL3hzZXJ2
ZXIveHNlcnZlci9ody9rZHJpdmUvc3JjL2tkcml2ZS5oLHYNCnJldHJpZXZpbmcgcmV2aXNpb24g
MS40NA0KZGlmZiAtcCAtdSAtcjEuNDQga2RyaXZlLmgNCi0tLSBody9rZHJpdmUvc3JjL2tkcml2
ZS5oCTE5IE5vdiAyMDAzIDA4OjMyOjM4IC0wMDAwCTEuNDQNCisrKyBody9rZHJpdmUvc3JjL2tk
cml2ZS5oCTEgRGVjIDIwMDMgMDI6NTM6MzYgLTAwMDANCkBAIC0yMyw2ICsyMyw5IEBADQogICov
DQogLyogJFJDU0lkOiB4Yy9wcm9ncmFtcy9Yc2VydmVyL2h3L2tkcml2ZS9rZHJpdmUuaCx2IDEu
MjkgMjAwMi8xMS8xMyAxNjozNzozOSBrZWl0aHAgRXhwICQgKi8NCiANCisjaWZuZGVmIF9LRFJJ
VkVfSF8NCisjZGVmaW5lIF9LRFJJVkVfSF8NCisNCiAjaW5jbHVkZSA8c3RkaW8uaD4NCiAjaW5j
bHVkZSA8WDExL1guaD4NCiAjZGVmaW5lIE5FRURfRVZFTlRTDQpAQCAtODUxLDMgKzg1NCw1IEBA
IEtkT2Zmc2NyZWVuRmluaSAoU2NyZWVuUHRyIHBTY3JlZW4pOw0KIC8qIGZ1bmN0aW9uIHByb3Rv
dHlwZXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRyaXZlcnMgKi8NCiB2b2lkDQogSW5pdENh
cmQgKGNoYXIgKm5hbWUpOw0KKw0KKyNlbmRpZiAvKiBfS0RSSVZFX0hfICovDQo=

--=-5yPRgVVL2nsJ/oktrCsY--